【问题标题】:Matplotlib: How to make two histograms have the same bin width?Matplotlib:如何使两个直方图具有相同的 bin 宽度?
【发布时间】:2014-05-12 19:19:50
【问题描述】:

我花了一些时间在互联网上搜索这个问题的答案,我也尝试过到处寻找答案,但我认为我没有正确的术语……请原谅我是一些已知问题的重复,我很乐意删除我的帖子并参考该帖子!

无论如何,我试图在 Matplotlib 中的同一个图形上绘制两个直方图。我的两个数据源是包含 500 个元素的列表。为了说明我面临的问题,请参见下图:

如您所见,在默认参数下,直方图的 bin 大小不均匀,即使 bin 的数量相同。我想保证两个直方图的 bin 宽度是相同的。有什么办法可以做到吗?

提前致谢!

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我认为一种在大多数情况下都可以轻松工作且无需担心每个数据集的分布范围是什么的一致方法是将数据集组合成一个大数据集,确定 bin 边缘,然后情节:

    a=np.random.random(100)*0.5 #a uniform distribution
    b=1-np.random.normal(size=100)*0.1 #a normal distribution 
    bins=np.histogram(np.hstack((a,b)), bins=40)[1] #get the bin edges
    plt.hist(a, bins)
    plt.hist(b, bins)
    

    【讨论】:

    • 赞成这两个答案,但这个答案绝对提供了关于如何以数据驱动的方式进行操作的最清晰的说明。谢谢!
    【解决方案2】:

    你应该使用hist返回的值中的bins

    import numpy as np
    import matplotlib.pyplot as plt
    
    foo = np.random.normal(loc=1, size=100) # a normal distribution
    bar = np.random.normal(loc=-1, size=10000) # a normal distribution
    
    _, bins, _ = plt.hist(foo, bins=50, range=[-6, 6], normed=True)
    _ = plt.hist(bar, bins=bins, alpha=0.5, normed=True)
    

    【讨论】:

    • 如果你在不设置范围的情况下使用它,第二个直方图可能会在末端被切掉。这是因为返回的 bin 是原始图中 bin 的边缘,可能不包括第二个直方图的所有数据。 bins=len(bins)-1 之类的东西可能会起作用(-1,因为 bin 边缘比 bin 多一个),但是你可能会遇到一些对齐问题。
    【解决方案3】:

    我猜你可以使用 range 参数和 bin 参数来为两个数据集提供相同的 bin 大小。

    plt.hist(x, bins=n, range=(a,b))
    

    如果您保持(b-a)/n 的比率相同,您最终应该得到相同的箱大小。

    【讨论】:

    • 这里需要指定范围,CT朱回答中不需要。
    • 但在 CT 朱回答中你需要 numpy