如何在Matplotlib饼图中显示带百分号的精确百分比数值
解决饼图显示原始百分比数值带百分号的问题
你的核心问题在于:plt.pie() 默认的 autopct 格式字符串是基于饼块占总数据的比例来计算的,而不是直接使用你DataFrame里的原始数值。因为你的数据总和是240(100+100+40),所以默认会把每个数值除以240再转成百分比,这显然不是你想要的效果。
要直接显示原始的“Percentage Answers”列数值并带上百分号,你需要用自定义函数替代格式字符串作为autopct的参数:
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 初始化数据 data = [['Basics 1', 100.0], ['Basics 2', 100.0], ['Basics 3', 40.0]] df = pd.DataFrame(data, columns=['Course', 'Percentage Answers']) # 自定义autopct函数:接收占比pct和所有原始数值,返回格式化后的字符串 def autopct_format(pct, allvals): # 通过占比匹配对应的原始数值 idx = np.argmin(np.abs(allvals / allvals.sum() - pct/100)) val = allvals[idx] # 格式化为整数加百分号 return f'{int(val)}%' # 绘制饼图,传递原始数值给自定义函数 my_labels = df['Course'].tolist() plt.pie(df["Percentage Answers"], labels=my_labels, autopct=lambda pct: autopct_format(pct, df["Percentage Answers"].values), pctdistance=0.8) # 调整百分比文本和中心的距离,避免和标签重叠 plt.title("Percentage of Teacher's Feedback Participation") plt.axis('equal') plt.show()
关键说明
- 自定义函数
autopct_format通过饼块占比反推对应的原始数值,再格式化为你需要的整数%形式(比如100%、40%)。 - 用
lambda函数把原始数值数组传递给自定义autopct函数——因为plt.pie()默认只给autopct传递占比参数。 pctdistance参数可以调整百分比文本的位置,数值越大离中心越远,你可以根据图表情况自行调整。
如果需要保留小数(比如显示50.5%),只需把返回语句改成return f'{val}%'即可。
内容的提问来源于stack exchange,提问作者Kathia
相关产品推荐
相关产品推荐

