以清晰易读的方式在1轴上显示3个直方图 - matplotlib

时间:2012-02-29 10:37:56

标签: python matplotlib

我已经生成了3组数据,这些数据以numpy数组的形式组织。我有兴趣将这三组数据的概率分布绘制为标准直方图。所有三个分布看起来应该几乎相同,所以将所有三个分布在同一轴上以便于比较似乎是明智的。

默认情况下,matplotlib直方图被绘制为条形图,这使得我想要的图像看起来非常混乱。因此,我的问题是是否可以强制pyplot.hist只绘制一个框/圆/三角形,其中条形图的顶部将是默认形式,这样我就可以在同一个图形上干净地显示所有三个分布或者是否我必须计算直方图数据,然后将其作为散点图单独绘制。

提前致谢。

1 个答案:

答案 0 :(得分:20)

有两种方法同时绘制三个直方图,但两者都不是你要求的。要做你要求的,你必须计算直方图,例如使用numpy.histogram,然后使用plot方法进行绘图。仅当您想通过设置每个点的大小将其他信息与您的点相关联时,才使用scatter

使用hist的第一种替代方法是将所有三个数据集一次传递给hist方法。然后hist方法调整每个条的宽度和位置,以便清楚地显示所有三个条。

第二种方法是使用histtype='step'选项,为每组设置清晰的图表。

这是一个演示此内容的脚本:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(101)
a = np.random.normal(size=1000)
b = np.random.normal(size=1000)
c = np.random.normal(size=1000)

common_params = dict(bins=20, 
                     range=(-5, 5), 
                     normed=True)

plt.subplots_adjust(hspace=.4)
plt.subplot(311)
plt.title('Default')
plt.hist(a, **common_params)
plt.hist(b, **common_params)
plt.hist(c, **common_params)
plt.subplot(312)
plt.title('Skinny shift - 3 at a time')
plt.hist((a, b, c), **common_params)
plt.subplot(313)
common_params['histtype'] = 'step'
plt.title('With steps')
plt.hist(a, **common_params)
plt.hist(b, **common_params)
plt.hist(c, **common_params)

plt.savefig('3hist.png')
plt.show()

这是由此产生的情节:

enter image description here

请记住,您也可以使用面向对象的界面完成所有这些操作,例如:制作个别的子情节等。