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

Python绘制饼图时如何隐藏无数据的分类项?

解决方法

核心问题说明

你当前代码会展示全部26个字母的原因是直接将所有字母的统计结果全量传入了绘图逻辑,没有过滤掉出现次数为0的条目,只需要新增过滤逻辑即可解决问题,同时可以大幅优化原有重复统计的冗余代码。

修正后完整代码

import matplotlib.pyplot as plt
from string import ascii_lowercase

# 接收用户输入并转为全小写(统一大小写统计)
answer = str(input('Please describe your thoughts on cats in a couple sentences:')).lower()

# 定义要排除的非字母字符
exclude_chars = set('123456789.!?, \'')
# 过滤出仅保留字母的内容
filtered_letters = [c for c in answer if c in ascii_lowercase]
# 统计每个字母的出现次数
letter_counts = {c: filtered_letters.count(c) for c in ascii_lowercase}
# 总字母数,用于计算占比
total_letters = len(filtered_letters)

# 过滤出出现次数>0的字母,分别生成标签和占比数组
valid_labels = []
valid_sizes = []
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'springgreen', 'moccasin', 'mediumslateblue', 'teal', 'maroon', 'salmon', 'yellowgreen', 'dodgerblue', 'pink', 'deeppink', 'plum', 'grey', 'white', 'black', 'wheat', 'slategrey', 'gold', 'aqua', 'indigo', 'chartreuse']

for letter, count in letter_counts.items():
    if count > 0:
        valid_labels.append(f"{letter}, {count/total_letters*100:.1f} %")
        valid_sizes.append(count/total_letters*100)

# 绘图逻辑
plt.rcParams["figure.autolayout"] = True
plt.pie(valid_sizes, colors=colors[:len(valid_sizes)], normalize=True, startangle=90)
plt.legend(loc='best', labels=valid_labels)
plt.axis('equal')
plt.title("Number of instances of each character in user input")
plt.show()

关键修改点

  • 简化统计逻辑:无需逐字母、逐符号手写count方法,直接通过内置的字母表遍历统计,提前过滤掉不需要纳入计算的数字、标点、空格等字符,代码更易维护
  • 新增有效条目过滤:统计完成后仅将出现次数大于0的字母加入绘图用的标签、占比数组,直接避免0占比字母出现在图例和饼图中
  • 适配颜色数组:根据实际需要展示的字母数量截取对应长度的颜色数组,避免数组长度不匹配的潜在问题

若需要区分大小写统计字母,仅需删除输入处理步骤的.lower(),同时将ascii_lowercase替换为string.ascii_letters即可。

内容的提问来源于stack exchange,提问作者missmouse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:06:07