【问题标题】:Normed histogram y-axis larger than 1标准化直方图 y 轴大于 1
【发布时间】:2020-05-19 00:22:55
【问题描述】:

有时,当我使用 seaborn 的 displot 函数,norm_hist = True 创建直方图时,y 轴小于 1,这与 PDF 的预期相同。其他时候它的值大于一。

例如,如果我运行

        sns.set(); 
        x = np.random.randn(10000)
        ax = sns.distplot(x)

然后直方图上的 y 轴按预期从 0.0 变为 0.4,但如果数据不正常,即使 norm_hist = True,y 轴也可以大到 30。

关于直方图函数的规范化参数,我缺少什么,例如sns.distplot 的 norm_hist?即使我自己通过创建一个新变量来规范化数据:

        new_var = data/sum(data)

为了使数据总和为 1,无论 norm_hist 参数是否为真,y 轴仍将显示远大于 1 的值(例如 30)。

当 y 轴有这么大的范围时,我能给出什么解释?

我认为正在发生的事情是我的数据非常集中在零附近,因此为了使数据的面积等于 1(例如在 kde 下),直方图的高度必须大于 1...但由于概率不能高于 1,结果是什么意思?

另外,我怎样才能让这些函数在 y 轴上显示概率?

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    规则并不是所有条形图的总和都为 1。规则是所有条形图的所有面积之和应为 1。当条非常窄时,它们的总和可能非常大,尽管它们的面积总和为 1。条的高度乘以其宽度是一个值都在该范围内的概率。要使高度等于概率,您需要宽度为 1 的条形。

    这里有一个例子来说明发生了什么。

    import numpy as np
    from matplotlib import pyplot as plt
    import seaborn as sns
    
    
    fig, axs = plt.subplots(ncols=2, figsize=(14, 3))
    
    a = np.random.normal(0, 0.01, 100000)
    sns.distplot(a, bins=np.arange(-0.04, 0.04, 0.001), ax=axs[0])
    axs[0].set_title('Measuring in meters')
    axs[0].containers[0][40].set_color('r')
    
    a *= 1000
    sns.distplot(a, bins=np.arange(-40, 40, 1), ax=axs[1])
    axs[1].set_title('Measuring in milimeters')
    axs[1].containers[0][40].set_color('r')
    
    plt.show()
    

    左边的地块使用0.001 米宽的箱子。最高的 bin(红色)大约是 40 high。一个值落入该 bin 的概率是40*0.001 = 0.04

    右图使用完全相同的数据,但以毫米为单位。现在垃圾箱是1 mm 宽。最高的 bin 大约是0.04 high。由于1 的bin 宽度,一个值落入该bin 的概率也是0.04

    PS:作为概率密度函数区域大于 1 的分布示例,请参阅 Pareto distributionα = 3

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 2017-10-05
      • 2012-07-30
      • 2014-01-30
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多