标准化同一图中的两个直方图
Normalizing two histograms in the same plot
如有任何见解,我将不胜感激。
我想在一个公共直方图上绘制两个数据集,这样两个直方图都没有顶部截止值并且概率分布范围为 0 到 1。
让我解释一下我的意思。到目前为止,我可以很好地将两个数据集绘制在一个直方图上,并通过在 ax.hist()
中写入 normed = 1
强制两个分布的积分为 1,如下图所示:
并且由这样的代码生成:
x1, w1, patches1 = ax.hist(thing1, bins=300, edgecolor='b', color='b', histtype='stepfilled', alpha=0.2, normed = 1)
x2, w2, patches2 = ax.hist(thing2, bins=300, edgecolor='g', color='g', histtype='stepfilled', alpha=0.2, normed = 1)
在一般情况下,一种概率分布比另一种概率分布高得多,因此很难看清楚情节。
因此,我尝试对两者进行归一化,使它们在 y 轴上的范围都从 0 到 1,并且仍然保持它们的形状。例如,我尝试了以下代码:
for item in patches1:
item.set_height(item.get_height()/sum(x1))
取自此处 How to normalize a histogram in python? 的讨论,但 python 向我抛出一条错误消息,指出没有 get_height
.
这样的质量
我的问题很简单:我怎样才能使 y 轴的范围从 0 到 1 并保持两个分布的形状?
我建议使用 numpy
预先计算直方图,然后使用 bar
在 matplotlib
中绘制它们。然后可以通过除以每个直方图的最大幅度来简单地将直方图归一化(按幅度)。请注意,为了在两个直方图之间进行任何类型的有意义的比较,最好对它们都使用相同的 bins
。下面是如何执行此操作的示例:
from matplotlib import pyplot as plt
import numpy as np
##some random distribution
dist1 = np.random.normal(0.5, 0.25, 1000)
dist2 = np.random.normal(0.8, 0.1, 1000)
##computing the bin properties (same for both distributions)
num_bin = 50
bin_lims = np.linspace(0,1,num_bin+1)
bin_centers = 0.5*(bin_lims[:-1]+bin_lims[1:])
bin_widths = bin_lims[1:]-bin_lims[:-1]
##computing the histograms
hist1, _ = np.histogram(dist1, bins=bin_lims)
hist2, _ = np.histogram(dist2, bins=bin_lims)
##normalizing
hist1b = hist1/np.max(hist1)
hist2b = hist2/np.max(hist2)
fig, (ax1,ax2) = plt.subplots(nrows = 1, ncols = 2)
ax1.bar(bin_centers, hist1, width = bin_widths, align = 'center')
ax1.bar(bin_centers, hist2, width = bin_widths, align = 'center', alpha = 0.5)
ax1.set_title('original')
ax2.bar(bin_centers, hist1b, width = bin_widths, align = 'center')
ax2.bar(bin_centers, hist2b, width = bin_widths, align = 'center', alpha = 0.5)
ax2.set_title('ampllitude-normalized')
plt.show()
还有这张照片:
希望对您有所帮助。
I've tried to normalise both such that they would both range from 0 to 1 on the y axis and still preserve their shape.
此方法不会让您的地块达到 0 到 1 的比例,但会使它们处于相同的比例 相对:
只需将 plt.hist()
函数调用中的参数设置为 density=True
,如下所示:
plt.hist([array_1, array2], density=True)
这将以相同的比例绘制您的两个分布,使得每个总和的曲线下面积为 1。
如有任何见解,我将不胜感激。
我想在一个公共直方图上绘制两个数据集,这样两个直方图都没有顶部截止值并且概率分布范围为 0 到 1。
让我解释一下我的意思。到目前为止,我可以很好地将两个数据集绘制在一个直方图上,并通过在 ax.hist()
中写入 normed = 1
强制两个分布的积分为 1,如下图所示:
并且由这样的代码生成:
x1, w1, patches1 = ax.hist(thing1, bins=300, edgecolor='b', color='b', histtype='stepfilled', alpha=0.2, normed = 1)
x2, w2, patches2 = ax.hist(thing2, bins=300, edgecolor='g', color='g', histtype='stepfilled', alpha=0.2, normed = 1)
在一般情况下,一种概率分布比另一种概率分布高得多,因此很难看清楚情节。
因此,我尝试对两者进行归一化,使它们在 y 轴上的范围都从 0 到 1,并且仍然保持它们的形状。例如,我尝试了以下代码:
for item in patches1:
item.set_height(item.get_height()/sum(x1))
取自此处 How to normalize a histogram in python? 的讨论,但 python 向我抛出一条错误消息,指出没有 get_height
.
我的问题很简单:我怎样才能使 y 轴的范围从 0 到 1 并保持两个分布的形状?
我建议使用 numpy
预先计算直方图,然后使用 bar
在 matplotlib
中绘制它们。然后可以通过除以每个直方图的最大幅度来简单地将直方图归一化(按幅度)。请注意,为了在两个直方图之间进行任何类型的有意义的比较,最好对它们都使用相同的 bins
。下面是如何执行此操作的示例:
from matplotlib import pyplot as plt
import numpy as np
##some random distribution
dist1 = np.random.normal(0.5, 0.25, 1000)
dist2 = np.random.normal(0.8, 0.1, 1000)
##computing the bin properties (same for both distributions)
num_bin = 50
bin_lims = np.linspace(0,1,num_bin+1)
bin_centers = 0.5*(bin_lims[:-1]+bin_lims[1:])
bin_widths = bin_lims[1:]-bin_lims[:-1]
##computing the histograms
hist1, _ = np.histogram(dist1, bins=bin_lims)
hist2, _ = np.histogram(dist2, bins=bin_lims)
##normalizing
hist1b = hist1/np.max(hist1)
hist2b = hist2/np.max(hist2)
fig, (ax1,ax2) = plt.subplots(nrows = 1, ncols = 2)
ax1.bar(bin_centers, hist1, width = bin_widths, align = 'center')
ax1.bar(bin_centers, hist2, width = bin_widths, align = 'center', alpha = 0.5)
ax1.set_title('original')
ax2.bar(bin_centers, hist1b, width = bin_widths, align = 'center')
ax2.bar(bin_centers, hist2b, width = bin_widths, align = 'center', alpha = 0.5)
ax2.set_title('ampllitude-normalized')
plt.show()
还有这张照片:
希望对您有所帮助。
I've tried to normalise both such that they would both range from 0 to 1 on the y axis and still preserve their shape.
此方法不会让您的地块达到 0 到 1 的比例,但会使它们处于相同的比例 相对:
只需将 plt.hist()
函数调用中的参数设置为 density=True
,如下所示:
plt.hist([array_1, array2], density=True)
这将以相同的比例绘制您的两个分布,使得每个总和的曲线下面积为 1。