Python饼图实现:如何按字母顺序而非数值排序楔形
按类别名称(字母顺序)排序饼图楔形的解决方法
问题背景
你创建了如下DataFrame:
import pandas as pd data = { 'T1': [1,1,1,1,1,2,2,2,2,2, 1,1,1,1,1, 2,2,2,2,2, 1,1,1,1,1, 2,2,2,2], 'T2':['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B','B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C','C', 'C', 'C', 'D', 'D', 'D', 'D']} df = pd.DataFrame(data)
使用matplotlib绘制饼图时,默认会按数值从高到低排序楔形:
import matplotlib.pyplot as plt fig, ax=plt.subplots() values2=df['T2'].value_counts() ax.pie(values2, radius=1.3, autopct= lambda x: '{:.0f}'.format(x*values2.sum()/100))
你尝试添加labels参数但未改变楔形排序,仅显示了标签:
ax.pie(values2, radius=1.3, autopct= lambda x: '{:.0f}'.format(x*values2.sum()/100), labels=values2.index)
解决方法
问题出在value_counts()默认是按数值降序返回统计结果的,即使指定labels,matplotlib仍会按照原Series的顺序绘制楔形。要实现按类别名称(字母顺序)排序,需要先对统计结果按索引(类别名称)排序。
步骤1:对统计结果按索引排序
将value_counts()的结果调用sort_index()方法,按字母顺序排列类别:
values2 = df['T2'].value_counts().sort_index()
步骤2:绘制饼图
此时再绘制饼图,楔形会按A→B→C→D的字母顺序排列,同时标签也会对应正确:
import matplotlib.pyplot as plt fig, ax=plt.subplots() values2 = df['T2'].value_counts().sort_index() ax.pie(values2, radius=1.3, autopct= lambda x: '{:.0f}'.format(x*values2.sum()/100), labels=values2.index) plt.show()
原理说明
sort_index()会将value_counts()返回的Series按索引(即T2的类别名称A、B、C、D)进行升序排序(默认),这样传给ax.pie()的数据顺序就是字母顺序,matplotlib会按照这个顺序绘制楔形,最终实现你想要的排序效果。
内容的提问来源于stack exchange,提问作者Kajette
相关产品推荐
相关产品推荐

