Matplotlib:如何让两个直方图具有相同的箱宽?

42 投票
3 回答
33374 浏览
提问于 2025-04-18 06:20

我在网上花了一些时间寻找这个问题的答案,也在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)

两个使用相同分箱的matplotlib直方图

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)

在这里输入图片描述

撰写回答