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

如何在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()

说明

  1. 过滤全零类别:通过字典推导式删除所有值为0的类别(比如RETRABALHO),避免在图表中显示无意义的空堆叠层。
  2. 隐藏零值标签:遍历每个柱状图的数值,仅为非零值生成标签,零值位置不显示标签,视觉上达到“不绘制零值”的效果,同时保证堆叠计算的正确性(零值不影响bottom的累加)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:41