【问题标题】:Strange behaviour of bar chart when using twinx in Matplotlib在 Matplotlib 中使用 twinx 时条形图的奇怪行为
【发布时间】:2019-03-20 02:02:59
【问题描述】:

我已经为此奋斗了太久,以至于我很确定我不了解 twinx 在 matplotlib 中的实现

好的,我有一些代码

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']

如果我只想绘制数据 1 一切都很好。

fig, ax1 = plt.subplots()
ax1.bar(label1, data1, yerr=err1, color='red')
plt.show()

这给了我一个漂亮的图表

如果我想将数据 2 添加到第二个轴上,我会丢失列并且顺序也很奇怪。

ax1.bar(label1, data1, yerr=err1, color='red')
ax2 = ax1.twinx()
ax2.bar(label2, data2, yerr=err2, color='blue')
plt.show()

没有给我 6 列,但只有 4 列,现在缺少两个 data1 列?

显然我 100% 确定这是我的错,但请有人让我摆脱这种痛苦......

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    问题在于您的条形图重叠,因此您看到的条形图少了两个。解决方案是使用明确定义的 x 值来定位条形图,然后在双轴上绘制后,分配 x-tick 标签。

    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']
    
    fig, ax1 = plt.subplots()
    ax1.bar(range(len(label1)), data1, yerr=err1, color='red')
    
    ax2 = ax1.twinx()
    ax2.bar(range(4,6), data2, yerr=err2, color='blue')
    ax2.set_xticks(range(6))
    ax2.set_xticklabels(label1+label2)
    plt.show()
    

    【讨论】:

    • 优秀 - 在文档中,我将“条形的 x 坐标”解释为指的是标签 - 它适用于单个图,但显然不适用于两个轴。
    • @nick.sculthorpe:在单轴上绘图时不需要传递range(4) 等。在那里你可以像以前那样做。但是对于双轴,您希望在 x=4 和 5 处连续绘制蓝条。因此您需要使用 0、1、2、3 作为左侧 y 轴
    【解决方案2】:

    你也可以这样做:

    label = ['var1', 'var2', 'var3', 'var4', 'var5', 'var6']
    data1 = [5, 6, 6, 7, np.NaN, np.NaN]
    data2 = [np.NaN, np.NaN, np.NaN, np.NaN, 0.5, 0.6]
    

    这里的问题是 matplotlib 轴转换为整数:'var1'->1、'var2'->2 等,ax2 是一个新轴,所以 'var4'->1、'var5'- >2,你得到重叠。使双轴之间的类别相同可以消除这种混乱。

    【讨论】:

    • 感谢您的解释 - @Bazingaa 解释了如何修复它,但我仍然觉得奇怪的是 Matplotlib 会添加右手轴,然后将列添加到左侧。至少底层机制现在有了某种意义。
    • 这两个轴对彼此的了解并不多,除了它们共享的 x 限制。改进可能是它们共享“转换器”(即从“类别”转换为整数的东西),但这有点复杂,还没有尝试过。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2021-10-14
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多