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

