【问题标题】:variation in matplotlib histogram bin widthmatplotlib 直方图 bin 宽度的变化
【发布时间】:2018-06-14 17:26:01
【问题描述】:

我正在 matplotlib 中创建一个直方图,但遇到问题是因为条形的宽度在它们都应该是相同的宽度时会发生变化。一个例子在这里:

Histogram showing variable bar width between iterations

在图像中,左列具有完整的直方图,右列放大了完整直方图的部分。在完整的直方图中,由于某种未知原因,两个试验之间的条形宽度不同,而在右侧的缩放中,它们具有相同大小的条形。我希望它们具有相同大小的条,其中 rwidth=1 并且相邻箱之间没有间隙。

当我将 rwidth 设置为默认值和将其设置为 1 时都会发生这种情况。here 提出了类似的问题,但它似乎与不同的刻度范围或条形重叠的轮廓有关,两者都不适用于我的图表。

有谁知道为什么我的垃圾箱宽度不同,或者我还能尝试什么让它们保持相同的宽度?

我使用的代码如下所示:

def graph_pvalues(both, selective, clearcut, trials, location):
    # define overall figure
    plt.figure(figsize=(16, int(project_images*(trials*0.15 + 0.5))))
    gs = gridspec.GridSpec(project_images-1, 3) 

    # plot one graph per substack size
    for v in range(project_images-1):
        # define subsets of data being graphed, remove nan values, and combine
        S_sub = selective[:, v]
        C_sub = clearcut[:, v]
        B_sub = both[:, v]
        graphed_data = [B_sub[~np.isnan(B_sub)], S_sub[~np.isnan(S_sub)], C_sub[~np.isnan(C_sub)]]

        # plot main graph
        ax1 = plt.subplot2grid((project_images-1, 3), (v, 0), colspan=2)
        ax1.hist(graphed_data, bins=50, rwidth=1, label=['both', 'selective', 'clearcut'])
        ax1.axis([0, 1, 0, trials])
        ax1.set_title("Disturbance at the %s using a substack of %i images" % (location, v+1))
        ax1.set_xlabel("p-value")
        ax1.set_ylabel("Number of trials")
        ax1.legend(prop={'size': 10})

        # plot zoom graph for 0 to 0.1
        ax2 = plt.subplot2grid((project_images-1, 3), (v, 2))
        ax2.hist(graphed_data, bins=10, range=(0, 0.1), label=['both', 'selective', 'clearcut'])
        ax2.axis([0, 0.1, 0, trials])
        ax2.set_title("Zoom 0 - 0.1 (%s, %i images)" % (location, v+1))
        ax2.set_xlabel("p-value")
        ax2.legend(prop={'size': 10})

    plt.tight_layout()

    plt.show()

【问题讨论】:

  • 我怀疑宽度会变化,因为您总是使用相对宽度 1,rwidth=1。这样做的目的是什么?为什么不删除它?
  • 即使我不使用 rwidth 参数也存在同样的问题。我尝试使用它来查看是否可以强制所有条具有相同的宽度。
  • 因此,如果您在 0 和 1 之间的范围内有 50 个 bin,它们的宽度将比在该范围内只有 10 个 bin 的情况下小 5 倍,对吧?
  • 是的,这就是左右图具有不同宽度的原因(如预期的那样)。我的问题是,当左侧两个图中的条形图都有 50 个分布在 0 和 1 之间的 bin 时,为什么它们的宽度不同?
  • 因为显然它们没有分布在同一范围内。查看图像,第一个数据集从 0 扩展到 0.9,而第二个数据集从 0 扩展到 0.18。

标签: python matplotlib histogram


【解决方案1】:

正如 cmets 中的 ImportanceOfBeingErnest 所指出的,除非您在绘图时特别设置 range 参数,否则 bin 将分布在您的数据范围内。所以在我的情况下,对于某些行,范围是 0-0.18,在其他地方是 0-0.98,从而导致条形宽度的变化。解决方法是将直方图线修改为:

ax1.hist(graphed_data, bins=50, range=(0,1), label=['both', 'selective', 'clearcut'])

使用 range 参数,并且 rwidth 参数是不相关且可选的。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2016-04-26
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多