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
相关产品推荐
相关产品推荐

