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

Matplotlib使用twinx绘制柱状图时出现异常的问题求助

解决Matplotlib twinx()导致柱状图丢失、顺序异常的问题

我完全懂你被这个问题折腾的感受——twinx的逻辑确实容易让人混淆,咱们先搞清楚为什么会出现这个问题,再一步步解决它。

问题根源

twinx()创建的是共享x轴坐标位置,但拥有独立y轴的坐标轴。你的两个数据集用了完全不同的x标签:ax1的标签是['var1','var2','var3','var4'](对应x轴位置0、1、2、3),而ax2的标签是['var5','var6'](默认对应x轴位置0、1)。这就导致蓝色的柱子直接覆盖在了红色的前两个柱子上,看起来像是红色柱子消失了;同时x轴只显示了4个位置,所以你看不到剩下的2个蓝色柱子。

解决办法:手动指定x轴位置

我们需要把所有x标签合并,给每个数据集分配对应的坐标位置,这样所有柱子都能正常显示。

方法1:直接映射所有标签到对应位置

这个方法最直观,把所有标签放在x轴上,每个数据对应自己的位置:

import matplotlib.pyplot as plt

data1 = [5, 6, 6, 7]
err1 = [1, 1, 1, 1]
data2 = [0.5, 0.6]
err2 = [0.01, 0.01]
label1 = ['var1', 'var2', 'var3', 'var4']
label2 = ['var5', 'var6']

# 合并所有x标签,生成对应的坐标位置
all_labels = label1 + label2
x_positions = range(len(all_labels))

fig, ax1 = plt.subplots()

# 为data1分配前4个坐标位置
ax1.bar(x_positions[:4], data1, yerr=err1, color='red', label='data1')
ax1.set_xticks(x_positions)
ax1.set_xticklabels(all_labels)
ax1.set_ylabel('Data1 数值')

# 创建双轴
ax2 = ax1.twinx()
# 为data2分配后2个坐标位置
ax2.bar(x_positions[4:], data2, yerr=err2, color='blue', label='data2')
ax2.set_ylabel('Data2 数值')

# 添加图例方便区分
fig.legend(loc='upper right')
plt.show()

方法2:柱子并排显示(可选)

如果希望不同数据集的柱子在同一组位置并排显示(比如扩展x轴位置后让左右柱子错开),可以设置柱子宽度和偏移:

import matplotlib.pyplot as plt

data1 = [5, 6, 6, 7]
err1 = [1, 1, 1, 1]
data2 = [0.5, 0.6]
err2 = [0.01, 0.01]
label1 = ['var1', 'var2', 'var3', 'var4']
label2 = ['var5', 'var6']

# 为两个数据集分别生成x坐标位置
x1 = range(len(label1))
x2 = [i + len(label1) for i in range(len(label2))]
all_x = x1 + x2
all_labels = label1 + label2

width = 0.35  # 设置柱子宽度

fig, ax1 = plt.subplots()
# 给data1的柱子左偏移
ax1.bar([x - width/2 for x in x1], data1, width=width, yerr=err1, color='red', label='data1')
ax1.set_xticks(all_x)
ax1.set_xticklabels(all_labels)
ax1.set_ylabel('Data1 数值')

ax2 = ax1.twinx()
# 给data2的柱子右偏移
ax2.bar([x + width/2 for x in x2], data2, width=width, yerr=err2, color='blue', label='data2')
ax2.set_ylabel('Data2 数值')

fig.legend(loc='upper right')
plt.show()

关键提醒

twinx()的核心是共享x轴的坐标位置,而不是共享标签。当两个数据集的x标签不同时,一定要手动为每个数据指定对应的x坐标位置,否则Matplotlib会默认把标签映射到0、1、2...的位置,导致柱子重叠或丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:27:50