如何在Matplotlib柱状图中不绘制零值
Matplotlib柱状图隐藏零值解决方案
问题分析
你的堆叠柱状图中存在零值条目(例如APROVADO的第二个值为0、RETRABALHO全为0),尝试用np.nan替换零值时触发RuntimeError: Unknown return type,原因是np.nan参与bottom累加计算后会导致坐标计算失效。
解决方案
通过两个步骤处理:过滤全零类别,隐藏零值位置的标签,避免np.nan带来的计算问题。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 保留原有数据处理逻辑 statusMont = dfFinal[dfFinal.columns[0:1]] valoresMont = dfFinal[dfFinal.columns[1:]] dados = [] for itens in valoresMont.itertuples(index=False, name=None): dados.append(itens) dadosKeys = [] for itens in statusMont.itertuples(index=False, name=None): dadosKeys.append(itens[0]) dicts = {} j = 0 for i in dadosKeys: values = np.array(list(dados[j])) dicts[i] = values j += 1 # 关键修改1:过滤掉所有值都为0的状态类别 dicts = {status: vals for status, vals in dicts.items() if not np.all(vals == 0)} width = 0.6 bottom = np.zeros(len(list(dados[0]))) fig, ax = plt.subplots() for status, vals in dicts.items(): p = ax.bar(selecao, vals, width, label=status, bottom=bottom) # 关键修改2:只给非零的柱状图添加标签,零值位置留空 labels = [f'{val}' if val != 0 else '' for val in vals] ax.bar_label(p, labels=labels, label_type='center') bottom += vals ax.set_title('Orçamentos - Por Montadora') ax.legend() plt.show()
说明
- 过滤全零类别:通过字典推导式删除所有值为0的类别(比如
RETRABALHO),避免在图表中显示无意义的空堆叠层。 - 隐藏零值标签:遍历每个柱状图的数值,仅为非零值生成标签,零值位置不显示标签,视觉上达到“不绘制零值”的效果,同时保证堆叠计算的正确性(零值不影响
bottom的累加)。
内容的提问来源于stack exchange,提问作者Felipe Morais
相关产品推荐
相关产品推荐

