【问题标题】:Plot a histogram with constant bar widths but different bin sizes绘制具有恒定条形宽度但具有不同 bin 大小的直方图
【发布时间】:2019-06-28 13:16:26
【问题描述】:

我有一个 Python 脚本,它生成三个数据集的单个直方图,其中 bin 大小作为列表提供。 Python脚本sippet如下:

bin_l=np.arange(0,14,1)
bin_l=np.append(bin_l,max_bin)

plt.hist([wind_plot_o, wind_plot_m, wind_plot_b],bins=bin_l, align='mid',
     label=['label1', 'label2', 'label3'],color=['k','g', 'r'])

其中,后面附加到bin_l 的元素是给定数据的最大值。所以最后一个 bin 大小会与其他 bin 大小不同。
上面的脚本 sn-p 与脚本的其余部分一起生成以下图:
这很好,除了一个问题。我需要所有条的大小相同,我不希望条的大小取决于箱大小,这在我的情况下看起来不太好。
hist() 的 matplotlib 文档说参数“rwidth”可用于调整条形宽度,仍然相对于 bin 大小,这是它当前正在做的,对我没有用。
那么,如何在使用非均匀 bin 大小的同时保持 matplotlib 直方图的条形宽度相同?

注意:它可能看起来像 this 帖子的副本,但事实并非如此。我没有在 X 轴上使用对数刻度。

【问题讨论】:

  • 我不建议在创建分组直方图时使用不相等的 bin 大小。这使得直方图非常难以阅读,甚至无法阅读。为什么不从一开始就使用bin_l=np.arange(0,17,1)
  • @ImportanceOfBeingErnest 不等分箱中的部分并不重要,但我不希望它们被排除在外。这就是为什么我在最后使用不相等的 bin 大小。

标签: python python-2.7 matplotlib histogram binning


【解决方案1】:

这有点不合常规。但是plt.hist 返回每​​个 bin 中的元素数。您可以使用此数据(或来自 numpy.histogram 的数据跳过绘制原始直方图)来创建等宽的“条形图”。

counts, _, _ = plt.hist(...)
plt.close()                                # Don't want the plot from plt.hist
for n, Y in enumerate(counts):
    X = [n*.3 + x for x in range(len(Y))]  # position bars next to each other
    plt.bar(X, Y, 0.3)

【讨论】:

  • 第三行是做什么的?特别是x for x in .... 部分。此外,代码可以正常工作而不会引发任何错误,但条形位置已关闭。看看here
  • 我仍然可以在 x 轴的末端看到不同大小的条。
  • @RogUE 我认为正在发生的事情是plt.hist 正在绘制在您的条形图之上。您可以使用plt.close 关闭原始绘图或使用np.histogram,这样就不会生成绘图。
  • 第三行是为您的 3 组数据创建 x 值。你想抵消每一个,这样它们就不会重叠。 列表理解正在生成数据。
  • 发布结果条形图很有帮助:)