You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:27:18