Python绘制饼图:自动对齐、关联图例、隐藏扇区标签实现方法
matplotlib 饼图三类问题解决方案
针对你提出的三个饼图绘制问题,直接按以下逻辑修改即可,无需手动反复调试参数:
- 扇区自动水平对齐:不需要反复试
startangle数值,两个分类场景下可通过占比自动计算角度值,公式固定,适配任意两分类占比。 - 图例自动关联:不要手动硬编码标签列表,直接绑定pandas序列的索引作为标签源,和传入饼图的数值顺序严格绑定,不会出现错位。
- 隐藏扇区分类文本:扇区上的分类名是
labels参数控制的,移除该参数后扇区仅保留autopct生成的百分比文本,分类标签统一放到图例中展示即可。
修正后可直接运行的代码
已修复原代码里的中文引号、参数类型错误、画布边距溢出问题:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 对应你给出的占比数据 my_df = pd.Series([40, 60], index=['Male', 'Female']) explode = [0.2, 0.02] fig = plt.figure(figsize=(10, 5), facecolor='White') ax = fig.add_axes((0.1, 0.1, 0.8, 0.8)) colors = sns.color_palette('bright') # 自动计算水平对齐需要的startangle,无需手动调试 auto_startangle = 90 - (360 * my_df.iloc[0] / my_df.sum()) / 2 # 绘制饼图,不传入labels参数,避免分类名直接显示在扇区上 wedges, _, autotexts = ax.pie( my_df, colors=colors, autopct='%0.0f%%', explode=explode, shadow=True, startangle=auto_startangle, textprops={'color': 'Black','fontsize':16}, wedgeprops={'linewidth': 6}, center=(0.1,0.1), rotatelabels=True ) ax.set_title('aaa', fontsize=16) # 绑定扇区对象和序列索引,自动生成匹配的图例 ax.legend(wedges, my_df.index, title='asd', loc=1) plt.show()
关键逻辑说明
- 自动对齐角度计算逻辑:
startangle的默认起始参考为x轴正方向,要让两个扇区的分割线保持水平,只需让第一个扇区的中心对准y轴正方向,代入公式即可算出准确角度,适配任意两分类占比场景。 - 图例绑定逻辑:
ax.pie()返回的第一个对象是所有扇区的实体列表,将其和pandas序列的索引(即分类名)按顺序传入ax.legend(),标签和扇区永远一一对应,不会因为手动改列表顺序出现错位。 - 扇区文本控制逻辑:
ax.pie()返回的第二个元素是labels参数生成的分类文本对象,第三个是autopct生成的百分比文本对象。只要不传入labels参数,扇区上就不会显示分类名,仅保留百分比文本。
内容的提问来源于stack exchange,提问作者Alberto Alvarez
相关产品推荐
相关产品推荐

