Seaborn 用直方图绘制分布图,其中 stat = 密度或概率?

2024-04-24

我知道,默认情况下,直方图方法是计算出现次数。相反,我们可以用密度或概率来可视化分布。

sns.displot(data, stat = 'density')

or

sns.displot(data, stat = 'probability')

我的问题是我应该使用哪些情况统计='密度' or 统计='概率' ?


stat = 'density'创建概率密度函数 (PDF) (维基百科 https://en.wikipedia.org/wiki/Probability_density_function).
正如 JohanC 在评论中提到的,PDF 的一个关键方面是曲线下的面积(或所有条形在一起)为 1。因此,条形宽度和条形高度都被考虑在内。

stat = 'probability'创建相同的条形(包括相同的宽度),但每个高度(y 轴值)直接说明该箱的概率。所有条形高度之和为 1。


使用哪一种取决于你想用情节“展示”什么以及观众是什么。

'probability'对于堆叠条形而言更直观且易于理解。
'density'更适合熟悉 PDF 的专家受众。

另外,由于 PDF 通常显示连续曲线'density' with displot并且 bins 更适合大量的 bins,而'probability' with displot也可以直观地工作,例如2 个垃圾箱。


Seaborn教程可视化数据分布 - 标准化直方图统计 https://seaborn.pydata.org/tutorial/distributions.html#normalized-histogram-statistics提供解释和示例图。
为了可视化该答案中的陈述,下面使用了减少的示例数据和图表以及不同的解释角度。


数据准备:(df 转换保持基本 - 具有# print以便于交叉检查)

import pandas as pd
import seaborn as sns


penguins = sns.load_dataset("penguins")
penguins_strip = penguins[['flipper_length_mm', 'sex']].dropna()
# print(penguins_strip)
print('Female and Male')
print(f'range: {penguins_strip["flipper_length_mm"].max() - penguins_strip["flipper_length_mm"].min()}')
print(f'len: {len(penguins_strip)}')

penguins_strip_male = penguins_strip[penguins_strip['sex'] == 'Male']
# print(penguins_strip_male)
print('Male only')
print(f'range: {penguins_strip_male["flipper_length_mm"].max() - penguins_strip_male["flipper_length_mm"].min()}')
print(f'len: {len(penguins_strip_male)}')
Female and Male
range: 59.0
len: 333

Male only
range: 53.0
len: 168

在顶部显示值的函数displot酒吧 - 很大程度上基于此特伦顿·麦金尼的回答 https://stackoverflow.com/a/68850867

def show_values(plot):
    for ax in plot.axes.ravel():
        # add annotations
        for c in ax.containers:
            # custom label calculates percent and add an empty string so 0 value bars don't have a number
            labels = [f'{w:0.5f}' if (w := v.get_height()) > 0 else '' for v in c]
            ax.bar_label(c, labels=labels, label_type='edge', fontsize=8, rotation=0, padding=2)
        ax.margins(y=0.2)

注意:由于显示的浮点数字有限,某些以下计算均四舍五入.


2 个垃圾箱,仅限“男性”脚蹼

默认显示图(无stat):

'probability'绘图 - 请注意每个 bin 总计为 1 的直观 y 轴概率。

'density'绘图 - 请参阅下面的面积计算

0.02156 * (53/2) = 0.57134
0.01617 * (53/2) = 0.428505
# see data preparation above, range is 53, and it's 2 bins

这两个面积相加为 1(四舍五入)。
你可以试试bins_nr = 1并轻松检查该区域。而对于'probability' with bins_nr = 1y 将仅为 1。

地块代码

bins_nr = 2

displot_default = sns.displot(penguins_strip_male, x="flipper_length_mm", hue="sex", 
                              bins=bins_nr, multiple="dodge")
show_values(displot_default)
    
displot_density = sns.displot(penguins_strip_male, x="flipper_length_mm", hue="sex", 
                              bins=bins_nr, multiple="dodge", stat = 'density')
show_values(displot_density)
        
displot_probability = sns.displot(penguins_strip_male, x="flipper_length_mm", hue="sex", 
                                  bins=bins_nr, multiple="dodge", stat = 'probability')
show_values(displot_probability)

堆积图示例(仅适用于'probability')

displot_probability_stacked = sns.displot(penguins_strip, x="flipper_length_mm", hue="sex", 
                                  bins=bins_nr, multiple="stack", stat = 'probability')
show_values(displot_probability_stacked)

插件:如果你想知道common_norm教程检查中的示例

displot_density = sns.displot(penguins_strip, x="flipper_length_mm", hue="sex", 
                              bins=bins_nr, multiple="dodge", stat = 'density')
show_values(displot_density)

displot_density_common = sns.displot(penguins_strip, x="flipper_length_mm", hue="sex", bins=bins_nr, 
                multiple="dodge", stat = 'density', common_norm=False)
show_values(displot_density_common)

并计算面积。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Seaborn 用直方图绘制分布图,其中 stat = 密度或概率? 的相关文章

  • 在 python 2 和 3 的spyder之间切换

    根据我在文档中了解到的内容 它指出您只需使用命令提示符创建一个新变量即可轻松在 2 个 python 环境之间切换 如果我已经安装了 python 2 7 则 conda create n python34 python 3 4 anaco
  • 如何用xlrd读取公式

    我正在尝试做一个解析器 它读取几个 Excel 文件 我通常需要位于行底部的值 您可以在其中找到所有上部元素的总和 因此 单元格值实际上是 sum 或 A5 0 5 可以说 对于使用 Excel 打开此文件的用户来说 它看起来像一个数字 这
  • multiprocessing.freeze_support()

    为什么多处理模块需要调用特定的function http docs python org dev library multiprocessing html multiprocessing freeze support在被 冻结 以生成 Wi
  • 如何在 openpyxl 中设置或更改表格的默认高度

    我想通过openpyxl更改表格高度 并且我希望首先默认一个更大的高度值 然后我可以设置自动换行以使我的表格更漂亮 但我不知道如何更改默认高度 唯一的到目前为止 我知道更改表格高度的方法是设置 row dimension idx heigh
  • 基于 True/False 值的 Python 优雅赋值

    我想根据三个布尔值中的值设置一个变量 最直接的方法是 if 语句后跟一系列 elif if a and b and c name first elif a and b and not c name second elif a and not
  • 一起使用 Argparse 和 Json

    我是 Python 初学者 我想知道 Argparse 和 JSON 是否可以一起使用 说 我有变量p q r 我可以将它们添加到 argparse 中 parser add argument p param1 help x variabl
  • 如何检查包含 NaN 的列表 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在我的 for 循环中 我的代码生成一个如下所示的列表 list 0 0 0 0 sum 0 0 0 0 该循环生成所有其他数字向量 但它也
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 如何使用注释和聚合在 Django 的 ORM 中执行此 GROUP BY 查询

    我真的不知道如何翻译GROUP BY and HAVING到姜戈的QuerySet annotate and QuerySet aggregate 我正在尝试将这个 SQL 查询转换为 ORM 语言 SELECT EXTRACT year
  • 别碰我的女人

    我讨厌的一件事迪斯图尔斯 http docs python org distutils 我猜他是邪恶的人 他这样做了 https github com python cpython blob 300dd552b15825abfe0e367a
  • 如何获取 Matplotlib 生成的散点图的像素坐标?

    我使用 Matplotlib 生成散点图的 PNG 文件 现在 对于每个散点图 除了 PNG 文件之外 我还会also就像生成散点图中各个点的像素坐标列表一样 我用来生成散点图 PNG 文件的代码基本上是这样的 from matplotli
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • python csv按列转换为字典

    是否可以将 csv 文件中的数据读取到字典中 使得列的第一行是键 同一列的其余行构成列表的值 例如 我有一个 csv 文件 strings numbers colors string1 1 blue string2 2 red string
  • DRF:以编程方式从 TextChoices 字段获取默认选择

    我们的网站是 Vue 前端 DRF 后端 在一个serializer validate 方法 我需要以编程方式确定哪个选项TextChoices类已被指定为模型字段的默认值 TextChoices 类 缩写示例 class PaymentM
  • 本地设置的 Cython 编译器指令是否影响一个或所有函数?

    我正在努力使用 Cython 加速一些 Python Numpy 代码 并且对 本地 设置 如定义的here http docs cython org en latest src reference compilation html在文档中
  • Pandas DataFrame:如何计算组中第一行和最后一行的差异?

    这是我的熊猫数据框 import pandas as pd import numpy as np data column1 338 519 871 1731 2693 2963 3379 3789 3910 4109 4307 4800 4
  • scrapy python 请求未定义

    我在这里找到了答案 code for site in sites Link site xpath a href extract CompleteLink urlparse urljoin response url Link yield Re
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 获取运行云功能的运行时服务帐户

    有没有办法以编程方式从云功能获取运行时服务帐户的电子邮件 我知道我可以 猜测 默认的 App Engine 帐户 因为它始终是 appspot gserviceaccount com 但这不是我想要的 我本来期待有一些环境变量 https
  • Python 中的迭代器 (iter()) 函数。 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 对于字典 我可以使用iter 用于迭代字典的键 y x 10 y 20 for val in iter y print val 当

随机推荐