我试图绘制一个平行多个数据的简单直方图 我的数据是一组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')
我得到了这个直方图:
我知道这可能是愚蠢的,但我不知道为什么我的 yticks 从0到4.5不等。我知道这是由于 normed 参数,但即便阅读此内容;
如果
True
,则返回元组的第一个元素将是计数 归一化以形成概率密度,即n/(len(x)*dbin)
。在一个 概率密度,直方图的积分应为1
;您 可以通过概率的梯形积分来验证 密度函数。
我没有真正了解它是如何运作的。
另外,一旦我将 bins 设置为等于5且直方图恰好有5个 xticks (不包括边框),我就不明白为什么我有在一些厚的中间的一些酒吧,像0.6厚的黄色。由于我的 bins 和 xticks 的数量匹配,我虽然每组四个条应该集中在每个区间内,就像它发生在四个第一个条,完全集中在[0.0,0.2]区间内。
提前谢谢。
答案 0 :(得分:2)
这令人困惑的原因是因为你在一块地块上压扁了四个直方图。为了做到这一点,matplotlib选择缩小条形并在它们之间留一个间隙。在标准直方图中,如果1
或normed
,则所有分箱的总面积为N
。这是一个简单的例子:
a = np.random.rand(10)
bins = np.array([0, 0.5, 1.0]) # just two bins
plt.hist(a, bins, normed=True)
首先请注意,每个条形图覆盖其所有区域:第一个条形范围从0
到0.5
,其高度由该范围内的点数给出。 />
接下来,您可以看到两个柱的总面积为1
,因为normed = True
:每个柱的宽度为0.5
,高度为1.2
和{{1 }}
让我们再次使用另一个发行版绘制相同的内容,以便您可以看到效果:
0.8
回想一下,蓝色条表示与第一个图中完全相同的数据,但它们现在不到宽度的一半,因为它们必须为绿色条形成空间。你可以看到现在两个条加上一些空格覆盖了每个bin的范围。因此,当我们计算料仓范围和料柱面积时,我们必须假装每个料条的宽度实际上是所有钢筋的宽度加上空白间隙的宽度。
最后,请注意xticks与binedges对齐。如果您愿意,可以手动将其设置为:
b = np.random.rand(10)
plt.hist([a, b], bins, normed=True)
如果您尚未先手动创建plt.xticks(bins)
,则可以从bins
抓取它:
plt.hist