【问题标题】:Trying to plot multiple bar charts together using plt.subplot尝试使用 plt.subplot 一起绘制多个条形图
【发布时间】:2019-10-09 23:03:31
【问题描述】:

我创建了三个条形图。我想使用非常流行的 fig, ax = plt.subplots 函数将它们全部绘制在一起。我无法让它们正确绘制在一起,但是当我分别运行下面的每一行时,我可以让它们单独显示

ax1 = buyreturns['return30'].plot.bar(grid=True, color=(buyreturns['return30'] > 0).map({True: 'g', False: 'r'}))
ax2 = buyreturns['return60'].plot.bar(grid=True, color=(buyreturns['return60'] > 0).map({True: 'g', False: 'r'}))
ax3 = buyreturns['return90'].plot.bar(grid=True, color=(buyreturns['return90'] > 0).map({True: 'g', False: 'r'}), legend = x)

我想使用 fig, ax = plt.subplots 函数让这些显示在彼此之上。

我尝试了以下代码,返回的视觉效果是所有三个条形图的合并,请参见下面的第一张图片

fig, (ax1, ax2, ax3) =  plt.subplots(3, 1, sharex=False, sharey= False, figsize=(24,16)) 

ax1 = buyreturns['return30'].plot.bar(grid=True, color=(buyreturns['return30'] > 0).map({True: 'g', False: 'r'}))
ax2 = buyreturns['return60'].plot.bar(grid=True, color=(buyreturns['return60'] > 0).map({True: 'g', False: 'r'}))
ax3 = buyreturns['return90'].plot.bar(grid=True, color=(buyreturns['return90'] > 0).map({True: 'g', False: 'r'}), legend = x)

plt.show()

我也尝试过以下代码,它返回第二张图片中的内容。

fig, (ax1, ax2, ax3) =  plt.subplots(3, 1, sharex=False, sharey= False, figsize=(24,16)) 

ax1.bar(len(buyreturns), buyreturns['return30'], bar_width, color=(buyreturns['return30'] > 0).map({True: 'g', False: 'r'}))
ax2.bar(len(buyreturns), buyreturns['return60'], bar_width, color=(buyreturns['return60'] > 0).map({True: 'g', False: 'r'}))
ax3.bar(len(buyreturns), buyreturns['return90'], bar_width, color=(buyreturns['return90'] > 0).map({True: 'g', False: 'r'}))

plt.show()

任何有关如何解决这些问题并返回 3 个条形图的意见都会很棒!谢谢

【问题讨论】:

    标签: python matplotlib plot bar-chart subplot


    【解决方案1】:

    在对plot()的调用中使用ax=<the reference to your axes>

    fig, (ax1, ax2, ax3) =  plt.subplots(3, 1, sharex=False, sharey= False, figsize=(24,16)) 
    
    buyreturns['return30'].plot.bar(grid=True, color=(buyreturns['return30'] > 0).map({True: 'g', False: 'r'}), ax=ax1)
    buyreturns['return60'].plot.bar(grid=True, color=(buyreturns['return60'] > 0).map({True: 'g', False: 'r'}), ax=ax2)
    buyreturns['return90'].plot.bar(grid=True, color=(buyreturns['return90'] > 0).map({True: 'g', False: 'r'}), ax=ax3)
    

    【讨论】:

    • 另外,删除ax1 = ... 分配。如果您知道它的作用(它将相同的轴对象重新分配给变量)是无害的,但我怀疑 OP 提出了这个问题,因为他们不知道并且以某种方式认为它会控制所选轴。
    【解决方案2】:

    类似于 Diziet 的回答,但更程序化

    fig, axes =  plt.subplots(3, 1, sharex=False, sharey= False, figsize=(24,16)) 
    
    # range(30,91,30) represents (30,60,90)
    for i, ax in zip(range(30,91,30), axes):
        col_name = f'return{i}'
        colors = (buyreturns[col_name] > 0).map({True: 'g', False: 'r'})
        buyreturns[col_name].plot.bar(grid=True, 
                                      color=colors,
                                      ax=ax)
    
    plt.show()
    

    【讨论】:

    • 很受欢迎,谢谢。你能解释一下范围'范围(30,91,30)代表(30,60,90)'吗?
    • for i in range(30,91,30) 将循环覆盖i=30, 60, 90
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多