【发布时间】:2015-07-10 23:39:43
【问题描述】:
我想在同一个图上绘制多个直方图,我需要比较数据的分布。我想通过将每个直方图除以其最大值来做到这一点,这样所有分布都具有相同的比例。但是,matplotlib 的直方图函数的工作方式,我还没有找到一种简单的方法来做到这一点。
这是因为n在
n, bins, patches = ax1.hist(y, bins = 20, histtype = 'step', color = 'k')
是每个 bin 中的计数数,但我无法将其重新传递给 hist,因为它会重新计算。
我尝试了范数和密度函数,但这些函数是对分布区域的归一化,而不是对分布的高度进行归一化。我可以复制 n 然后使用 bins 输出重复 bin 边缘,但这很乏味。当然 hist 函数必须允许将 bin 值除以常数吗?
示例代码如下,演示了问题。
y1 = np.random.randn(100)
y2 = 2*np.random.randn(50)
x1 = np.linspace(1,101,100)
x2 = np.linspace(1,51,50)
gs = plt.GridSpec(1,2, wspace = 0, width_ratios = [3,1])
ax = plt.subplot(gs[0])
ax1 = plt.subplot(gs[1])
ax1.yaxis.set_ticklabels([]) # remove the major ticks
ax.scatter(x1, y1, marker='+',color = 'k')#, c=SNR, cmap=plt.cm.Greys)
ax.scatter(x2, y2, marker='o',color = 'k')#, c=SNR, cmap=plt.cm.Greys)
n1, bins1, patches1 = ax1.hist(y1, bins = 20, histtype = 'step', color = 'k',linewidth = 2, orientation = 'horizontal')
n2, bins2, patched2 = ax1.hist(y2, bins = 20, histtype = 'step', linestyle = 'dashed', color = 'k', orientation = 'horizontal')
【问题讨论】:
-
在我看来
normed是要走的路。 -
不幸的是,
normed标准化了曲线下的面积,而不是高度。 -
是的,但这通常是比较直方图的正确方法。您是否正在寻找不同的统计数据?
-
我同意。但这是两种不同的分布,我想比较数据的分布,这在我缩放到高度时最为明显,因为一个的最大 bin 值为 150,另一个的最大 bin 值为 30。
标签: python numpy matplotlib histogram