对于任意一个字典形式的数据绘制饼图的代码如下:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
def get_random():
return "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', np.random.random_integers(3, 10)))
def plot_pie(dict_value: dict):
keys = list(dict_value.keys())
values = list(dict_value.values())
plt.pie(values, labels=keys)
plt.legend()
plt.show()
def main():
series = pd.Series(np.random.randint(1, 10, size=20))
series.index = [get_random() for _ in range(len(series))] # 构造数据
plot_pie(series.to_dict()) # 常规的图
if __name__ == '__main__':
main()
如果使用如下的绘图方法:
def plot_pie_optimize(dict_value: dict):
keys = list(dict_value.keys())
values = np.array(list(dict_value.values()))
patches, texts = plt.pie(values)
labels = ['{} {:1.2f}% ({})'.format(i, j, v) for i, j, v in
zip(keys, 100. * values / values.sum(), values)] # 构造图例数据
patches, labels, dummy = zip(*sorted(
zip(patches, labels, values), key=lambda x: x[2], reverse=True))
plt.legend(patches, labels, loc="center", bbox_to_anchor=(-0.1, 0.5), fontsize=8)
plt.tight_layout()
plt.show()
就可以得到如下的效果:
它的原理是绘图的时候:
labels
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
def get_random():
return "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', np.random.random_integers(3, 10)))
def plot_pie(dict_value: dict):
keys = list(dict_value.keys())
values = list(dict_value.values())
plt.pie(values, labels=keys)
plt.legend()
plt.show()
def plot_pie_optimize(dict_value: dict):
keys = list(dict_value.keys())
values = np.array(list(dict_value.values()))
patches, texts = plt.pie(values)
labels = ['{} {:1.2f}% ({})'.format(i, j, v) for i, j, v in
zip(keys, 100. * values / values.sum(), values)] # 构造图例数据
patches, labels, dummy = zip(*sorted(
zip(patches, labels, values), key=lambda x: x[2], reverse=True))
plt.legend(patches, labels, loc="center", bbox_to_anchor=(-0.1, 0.5), fontsize=8)
plt.tight_layout()
plt.show()
def main():
series = pd.Series(np.random.randint(1, 10, size=20))
series.index = [get_random() for _ in range(len(series))] # 构造数据
plot_pie(series.to_dict()) # 常规的图
plot_pie_optimize(series.to_dict()) # 把legend放外面的图
if __name__ == '__main__':
main()