【问题标题】:Calculate the area under the histogram with Seaborn用Seaborn计算直方图下的面积
【发布时间】:2026-01-18 22:45:02
【问题描述】:

我正在尝试使用此函数计算 seaborn 直方图下的面积(数据已标准化)

sum (np.diff(bins_sns)*values_sns)

获取箱的宽度和我正在使用的高度值

values_sns=[h.get_height()for h in sns.distplot(data).patches]
bins_sns=[h.get_width ()for h in sns.distplot(data).patches]

但它们的长度不同,即 71,48。 这是我得到的错误:ValueError: 操作数不能与形状一起广播 (71,) (​​48,)

任何帮助将不胜感激。

【问题讨论】:

    标签: python histogram seaborn area


    【解决方案1】:

    这里有几个地方出了问题:

    • sns.distplot(data) 创建直方图(连同 kdeplot);在上面的代码中,它被调用了两次,因此在同一个位置创建了两个直方图
    • sns.distplot(data) 返回它所绘制的axax 包含一个子图的所有图形元素
    • ax.patches 返回所有已绘制补丁的列表(补丁可以是矩形、圆形、闭合曲线……)
    • sns.distplot(data)不是给定ax的第一次绘制操作时,ax.patches可以包含之前绘制的元素;特别是调用sns.distplot(data) 两次会使补丁数量增加一倍(在这种情况下,似乎绘制了 48 个条形图)
    • np.diff(bins_sns) 将包含后续 bin 宽度之间的所有差异。请注意,差异比值少一个(72 个值产生 71 个差异)。由于通常所有 bin 宽度都相等,np.diff(bins_sns) 将全为零。
    • 要计算总面积,您需要将所有单个宽度乘以所有单个高度
    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np
    
    data = np.random.normal(0, 1, 100)
    ax = sns.distplot(data)
    
    values_sns = [h.get_height() for h in ax.patches]
    bins_sns = [h.get_width() for h in ax.patches]
    
    total_area = sum([height * width for height, width in zip(values_sns, bins_sns)])
    # total_area = np.sum(np.array(bins_sns) * np.array(values_sns)) # shorter, faster using numpy
    print("total_area:", total_area)  # 1.0
    

    【讨论】:

    • 有点晚了,抱歉。感谢您的帮助