Matplotlib:如何让两个直方图具有相同的箱宽?
我在网上花了一些时间寻找这个问题的答案,也在StackOverflow上到处找,但我觉得我可能没有用对术语……如果这跟某个已知问题重复了,请原谅我,我会乐意删除我的帖子并参考那个帖子!
无论如何,我想在Matplotlib中把两个直方图画在同一个图上。我的两个数据源都是500个元素的列表。为了说明我遇到的问题,请看下面的图片:
如你所见,直方图在默认参数下的箱子大小不均匀,尽管箱子的数量是一样的。我想确保两个直方图的箱子宽度是相同的。有没有办法做到这一点呢?
提前谢谢你!
3 个回答
17
我想你可以把范围参数和箱子参数一起用,这样就能让两个数据集的箱子大小一样。
plt.hist(x, bins=n, range=(a,b))
也就是说,如果你保持 (b-a)/n
的比例不变,最后得到的箱子大小就会是一样的。
21
你应该使用从 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)
54
我觉得有一种简单的方法可以适用于大多数情况,这样你就不用担心每个数据集的分布范围了。你可以把所有的数据集合并成一个大数据集,然后确定分组的边界,最后再进行绘图:
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)