【问题标题】:Matplotlib - Find bar chart width valueMatplotlib - 查找条形图宽度值
【发布时间】:2017-10-14 16:59:53
【问题描述】:

希望这里是一个相对简单的问题 - 我正在绘制两个条形图。其中一个类别更多,因此每个条的宽度更小。请参阅下面的示例代码/图表(简单的标准绘图):

fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True)

ax1.set_title("Sample Graph", size='16')
ax1.bar(df1.index, df1.c_destination, color='purple', alpha =1)
ax1.set_axisbelow(True)
ax1.set_xticks(df1.index)
ax1.set_xticklabels(df1['index'], rotation=45, ha='right', size='14')
ax1.patch.set_facecolor(color='gray')
ax1.patch.set_alpha(0.5)

ax2.set_title("Sample Graph Other", size='16')
ax2.bar(df2.index, df2.destination, color='purple', alpha =1)
ax2.set_axisbelow(True)
ax2.set_xticks(df2.index)
ax2.set_xticklabels(df2['index'], rotation=45, ha='right', size='14')
ax2.patch.set_facecolor(color='gray')
ax2.patch.set_alpha(0.5)

如果左图有 12 个条,右图有 8 个条,如何确保条数较少的图具有相同的条宽?我知道我可以在每个中定义宽度,但我想知道 ax2 是否可以从 ax1 访问这个值?感谢您的帮助。

【问题讨论】:

  • bar(x, y, width=30) 你不能只使用width 参数吗?值得一试
  • 我可以,但正如我所提到的,我需要分别定义 ax1 和 ax2。我正在尝试利用 ax1 中自动生成的宽度并将其传递给 ax2。

标签: python pandas matplotlib


【解决方案1】:
In [147]: [p.get_width() for p in ax1.patches]
Out[147]: [0.5, 0.5, 0.5, 0.5, 0.5]

【讨论】:

    【解决方案2】:

    请注意,这些条实际上确实具有相同的宽度。它们都是 0.8 个数据单元宽。但是,由于左轴范围较大,因此数据单元比右轴小。

    您可以做的是在两种情况下使用相同的数据范围,例如通过共享 x 轴,

    plt.subplots(1, 2, sharey=True, sharex=True)
    

    【讨论】:

    • 这很有趣。我已经尝试过这种方法,但似乎我的 ax1 采用了较小的 ax2 范围(并且标签消失了)。既然 Max 回答了我的问题(我不知道两者的宽度相同),我应该单独再问一次这个问题吗?具体询问如何匹配两个图中的条形外观?
    • 这是您的选择,您也可以编辑您的问题。但无论如何,请务必提供问题的minimal reproducible example
    • 顺便说一句。如果它只是关于共享轴上的缺失值,则最后绘制具有较多条形的图表。