gpt4 book ai didi

python - 多个数据的直方图中的条形高度和宽度

转载 作者:行者123 更新时间:2023-12-01 05:15:34 25 4
gpt4 key购买 nike

我正在尝试绘制一个包含多个并行数据的简单直方图。
我的数据是一组 2D ndarrays,它们都具有相同的尺寸(在本例中为 256 x 256)。

我有这个方法来绘制数据集:

def plot_data_histograms(data, bins, color, label, file_path):
"""
Plot multiple data histograms in parallel
:param data : a set of data to be plotted
:param bins : the number of bins to be used
:param color : teh color of each data in the set
:param label : the label of each color in the set
:param file_path : the path where the output will be save
"""
plt.figure()
plt.hist(data, bins, normed=1, color=color, label=label, alpha=0.75)
plt.legend(loc='upper right')
plt.savefig(file_path + '.png')
plt.close()

我按如下方式传递数据:

data = [sobel.flatten(), prewitt.flatten(), roberts.flatten(), scharr.flatten()]
labels = ['Sobel', 'Prewitt', 'Roberts Cross', 'Scharr']
colors = ['green', 'blue', 'yellow', 'red']

plot_data_histograms(data, 5, colors, labels, '../Visualizations/StatisticalMeasures/RMSEHistograms')

我得到了这个直方图:

histogram

我知道这可能很愚蠢,但我不明白为什么我的 yticks 从 0 变化到 4.5。我知道这是由于 normed 参数造成的,但即使阅读此内容;

If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)*dbin). In a probability density, the integral of the histogram should be 1; you can verify that with a trapezoidal integration of the probability density function.

我不太明白它是如何工作的。

此外,一旦我将bins设置为等于5,并且直方图恰好有5个xticks(不包括边框),我不明白为什么我有一些条形在一些厚度的中间,比如0.6厚的黄色的。由于我的 bins 数量和 xticks 匹配,我认为每组四个条形图应该集中在每个间隔内,就像前四个条形图发生的情况一样,完全集中在 [0.0, 0.2] 区间内。

提前谢谢您。

最佳答案

这令人困惑的原因是因为您在一个图上压缩了四个直方图。为了做到这一点,matplotlib 选择缩小条形并在它们之间留出间隙。在标准直方图中,如果 normed,所有箱的总面积为 1,或者为 N。这是一个简单的例子:

 a = np.random.rand(10)
bins = np.array([0, 0.5, 1.0]) # just two bins
plt.hist(a, bins, normed=True)

normed

首先请注意,每个条形覆盖了其 bin 的整个范围:第一个条形的范围从 00.5,其高度由点数给出在这个范围内。
接下来,您可以看到两个条形的总面积为 1,因为 normed = True:每个条形的宽度为 0.5,并且高度为 1.20.8

让我们用另一个分布再次绘制相同的图像,以便您可以看到效果:

 b = np.random.rand(10)
plt.hist([a, b], bins, normed=True)

normed with two

回想一下,蓝色条代表与第一个图中完全相同的数据,但它们现在的宽度小于一半,因为它们必须为绿色条腾出空间。您可以看到现在有两个条形加上一些空白覆盖了每个 bin 的范围。因此,在计算 bin 范围和 bar 面积时,我们必须假设每个 bar 的宽度实际上是所有 bar 的宽度加上空白间隙的宽度。

最后,请注意 xticks 没有与 binedges 对齐的地方。如果您愿意,您可以手动设置为这种情况,方法是:

plt.xticks(bins)

如果您没有先手动创建bins,您可以从plt.hist获取它:

counts, bins, bars = plt.hist(...)
plt.xticks(bins)

关于python - 多个数据的直方图中的条形高度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com