有几个要点:
- 使用
plt.pie()
绘制饼图,同时需要有一个参数autopct
(比如autopct='%.2f%%'
)这样就可以返回一个auto_texts
的返回值 - 循环
auto_texts
的每个元素,是一个Text类,使用.set_text()
就可以重新设置显示的数据了
示例程序
import os
import warnings
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import font_manager as fm
warnings.filterwarnings('ignore')
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
def plot_pie(value_series, title):
plt.cla()
plt.clf()
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
fig, axes = plt.subplots(figsize=(10, 7), ncols=2) # 设置绘图区域大小
ax1, ax2 = axes.ravel()
patches, texts, auto_texts = ax1.pie(value_series.values, labels=value_series.index, autopct='%.2f%%',
shadow=False, startangle=170, normalize=True)
# ================= 核心 ! ===================
# 这里设置每一个不同的份额显示内容
for _auto_i, _auto_text in enumerate(auto_texts):
_auto_text.set_text(
f"{value_series.values[_auto_i]}/{value_series.sum()}({round(value_series.values[_auto_i] / value_series.sum() * 100, 2)}%)")
# 调整图例
ax1.axis('equal')
# 重新设置字体大小
font_prop = fm.FontProperties()
font_prop.set_size('large')
plt.setp(auto_texts, fontproperties=font_prop)
plt.setp(texts, fontproperties=font_prop)
if title:
ax1.set_title(title, loc='center')
# ax2 只显示图例(legend)
ax2.axis('off')
ax2.legend(patches, value_series.index, loc='center left')
plt.tight_layout()
# 保存在当前目录下
plt.savefig(os.path.join(os.path.dirname(os.path.realpath(__file__)), f"{title}.png"),
dpi=100, bbox_inches='tight')
plt.show()
def main():
series_value = pd.Series({
"份额1": 25,
"份额2": 25,
"份额3": 40,
"份额4": 100,
})
plot_pie(series_value, title="示例图")
if __name__ == '__main__':
main()
原来:
最终效果: