Matplotlib:如何使两个直方图具有相同的bin宽度?

eri*_*mjl 25 python matplotlib

我花了一些时间搜索interwebs对于这个答案,我曾尝试寻找所有SO的答案也一样,但我觉得我没有正确的术语下来......请原谅我,如果这是一个重复一些已知的问题,我很乐意删除我的帖子并转而参考该帖子!

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

不均匀的直方图

如您所见,直方图在默认参数下具有不均匀的箱尺寸,即使箱的数量相同.我想保证两个直方图的bin宽度是相同的.有什么方法可以做到这一点吗?

提前致谢!

CT *_*Zhu 28

我认为,对于大多数情况而言,一致的方法可以轻松地工作,而不必担心每个数据集的分布范围,将数据集放在一起,确定二进制数边缘,然后绘制:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


mar*_*ion 12

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

plt.hist(x, bins=n, range=(a,b))
Run Code Online (Sandbox Code Playgroud)

如果你保持(b-a)/n相同的比例,你应该最终使用相同的箱尺寸.


Adr*_*aud 9

您应该使用bins以下返回的值hist:

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)
Run Code Online (Sandbox Code Playgroud)

两个具有相同分级的matplotlib直方图

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