生成器函数无法迭代致Matplotlib饼图仅显示单个百分比值问题
问题分析
你的代码存在两个核心问题:
- autopct参数用法错误:你直接传入
str(next(gne_pct(pct))),这只会取生成器的第一个值并转成固定字符串,导致饼图无法匹配每个扇区的对应百分比,仅显示单一数值。 - 生成器逻辑冗余且错误:
gne_pct这个lambda函数完全没必要,它忽略了传入的参数,直接遍历外部的pct列表;而且每次调用gne_pct(pct)都会生成新的生成器,next()只能获取第一个元素,无法遍历所有百分比。
解决方案
方案1:利用Matplotlib自动计算百分比(推荐)
Matplotlib的pie函数会自动计算每个扇区占总和的百分比,直接通过autopct传入格式字符串即可,无需手动计算pct列表:
import matplotlib.pyplot as plt plt.figure(figsize=plt.figaspect(1)) # %1.2f%% 表示保留两位小数并添加百分号,可根据需求调整小数位数 sect_grph = plt.pie(pvt_meth_sect.value, labels=pvt_meth_sect.index, colors='rgby', autopct='%1.2f%%') plt.show()
方案2:使用自定义预计算百分比
如果你一定要用手动计算的pct列表,可以通过迭代器配合自定义函数实现:
import matplotlib.pyplot as plt pct = [] Total = pvt_meth_sect.value.sum() for val in pvt_meth_sect.value: pct.append((val/Total)*100) # 用迭代器包装pct,每次调用返回下一个预计算的百分比 pct_iter = iter(pct) def autopct_func(_): return f"{next(pct_iter):.2f}%" plt.figure(figsize=plt.figaspect(1)) sect_grph = plt.pie(pvt_meth_sect.value, labels=pvt_meth_sect.index, colors='rgby', autopct=autopct_func) plt.show()
原代码失效原因
gne_pct = lambda x : (x for x in pct):lambda的参数x完全未被使用,生成器直接依赖外部的pct列表,每次调用都会生成新的生成器,next()只能拿到第一个元素。autopct=str(next(gne_pct(pct))):此处传入的是固定字符串,而autopct需要的是格式字符串或可调用函数,固定字符串无法适配每个扇区的不同百分比,导致显示异常。
内容的提问来源于stack exchange,提问作者pathfinder2212
相关产品推荐
相关产品推荐

