【问题标题】:Bar heights and widths in histogram plot of several data几个数据的直方图中的条形高度和宽度
【发布时间】:2014-06-11 15:15:07
【问题描述】:

我正在尝试绘制一个包含多个并行数据的简单直方图。
我的数据是一组 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厚的黄色。由于我的 binsxticks 的数量匹配,我认为每组四个条应该集中在每个间隔内,就像前四个条一样,完全集中在 [0.0, 0.2] 区间内。

提前谢谢你。

【问题讨论】:

    标签: python matplotlib histogram


    【解决方案1】:

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

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

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

    让我们用另一个分布再次绘制同样的东西,这样你就可以看到效果了:

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

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

    最后,请注意 xticks 没有与 binedges 对齐。如果您愿意,您可以手动将其设置为:

    plt.xticks(bins)
    

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

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

    【讨论】:

    • 感谢您的详细解答。 (:
    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多