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

当存在None值时,如何在Matplotlib柱状图中居中显示柱子

解决柱状图含None值时柱子居中问题

问题出在你处理Attack数据的位置计算上:过滤掉None值后,只给非None的数据设置了偏移位置,但没有为缺失Attack数据的类别调整Win柱子的位置,导致这类别的Win柱子和刻度不居中对齐。

解决方案思路

为每个类别单独处理柱子绘制:

  • 当类别有Attack数据时,将Win和Attack柱子分别放在组中心的左右两侧,保持并排布局
  • 当类别无Attack数据时,将Win柱子直接放在组中心位置,实现居中显示

修改后的代码

import matplotlib.pyplot as plt
import numpy as np

# Define the data
categories = ['bear', 'neutral', 'man']
wins = [2, 3, 7]
attacks = [3, None, 5]

width = 0.35  # 柱子宽度
x = np.arange(len(categories))  # 每个类别的中心位置

fig, ax = plt.subplots()

for i in range(len(categories)):
    win_val = wins[i]
    attack_val = attacks[i]
    
    if attack_val is not None:
        # 有Attack数据时,Win在组中心左侧,Attack在右侧
        ax.bar(x[i] - width/2, win_val, width, label='Win' if i == 0 else "")
        ax.bar(x[i] + width/2, attack_val, width, label='Attack' if i == 0 else "")
    else:
        # 无Attack数据时,Win居中显示
        ax.bar(x[i], win_val, width, label='Win' if i == 0 else "")

# 设置刻度和标签
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

plt.show()

代码说明

  1. 用np.arange生成每个类别的中心位置x,确保每个分组的刻度对齐中心
  2. 遍历每个类别,根据是否存在Attack数据选择不同的柱子位置:
    • 有Attack时,Win和Attack分别偏移width/2到中心两侧,保持并排
    • 无Attack时,Win直接放在中心位置,自然居中
  3. 标签只在第一次出现时添加,避免图例重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:37