Matplotlib子图饼图类别颜色不一致、C/F列数值显示错误问题求助
问题根源
代码问题出在pandas.Series.value_counts()的默认返回逻辑和饼图颜色匹配规则不匹配:
value_counts()默认按统计值从高到低排序返回,若某列只有单一取值,仅返回该取值的统计结果- 调用
plt.pie()时没有显式绑定取值和颜色的对应关系,导致全为NO的C列、全为SI的F列,统计结果都只有1个元素,都匹配到了设置的第一个颜色#172a3d,最终展示效果完全一致。
解决方案
统计每个列的取值数量时,用reindex固定NO、SI的返回顺序,缺失的取值补0,保证两者永远和设置的颜色顺序对应。
修改后完整代码如下:
import pandas as pd import matplotlib.pyplot as plt colnames=['a','b','c','d','e','f','g'] values=[ ['SI','SI','NO','SI','SI','SI','NO'], ['SI','NO','NO','SI','NO','SI','NO'], ['SI','SI','NO','SI','SI','SI','NO'], ['SI','NO','NO','NO','NO','SI','SI'], ['SI','NO','NO','NO','NO','SI','NO']] df=pd.DataFrame(values, columns=colnames) def pieplotstest(df): fig,ax =plt.subplots(2,3,facecolor=(1, 1, 1),figsize=(7.2,4.3)) plt.style.use('fivethirtyeight') colors=["#172a3d","#e33e31"] textprops=dict(color="w",weight='bold',size=5) count_labels = ['NO','SI'] # 固定取值顺序,和颜色一一对应 # 封装公共饼图绘制逻辑,减少冗余代码 def draw_pie(ax, col_name, pct_distance=0.75): # 固定顺序统计,缺失取值自动补0 count_data = df[col_name].value_counts().reindex(count_labels, fill_value=0) ax.pie(count_data, colors=colors, autopct = '%1.1f%%', textprops=textprops, wedgeprops=dict(width=0.5), pctdistance=pct_distance ) ax.set_title(col_name, fontsize=10) draw_pie(ax[0,0], 'b', pct_distance=0.7) # 保留原b列的特殊pctdistance设置 draw_pie(ax[0,1], 'c') draw_pie(ax[0,2], 'd') draw_pie(ax[1,0], 'e') draw_pie(ax[1,1], 'f') draw_pie(ax[1,2], 'g') fig.legend(count_labels, loc=4, fontsize=7 ) plt.suptitle('Como estan distribuidas tus ventas') fig.tight_layout() plt.savefig(f'orders3.png',dpi=600,transparent=True) # 调用执行 pieplotstest(df) plt.show()
内容的提问来源于stack exchange,提问作者Matias Ordoñez
相关产品推荐
相关产品推荐

