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

生成器函数无法迭代致Matplotlib饼图仅显示单个百分比值问题

问题分析

你的代码存在两个核心问题:

  1. autopct参数用法错误:你直接传入str(next(gne_pct(pct))),这只会取生成器的第一个值并转成固定字符串,导致饼图无法匹配每个扇区的对应百分比,仅显示单一数值。
  2. 生成器逻辑冗余且错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:17