【问题标题】:Cannot understand matplotlib pyplot histogram看不懂matplotlib pyplot直方图
【发布时间】:2021-01-25 02:00:37
【问题描述】:

我只是在学习一些数据分析的基础知识。

我有一个简单的 csv 数据文件,如下所示。

START,FIRST,SECOND,ITEM
1,100,200,A
2,100,200,B
2,100,300,C
2,200,300,D
3,200,100,E
3,200,100,F
3,200,100,G
3,200,100,H
3,200,100,I
3,200,100,J

我编写了这个小程序来读取这个 csv 文件,然后使用 matplotlib 为 START、FIRST 和 SECOND 三列打印直方图。我还打印了 FIRST 与 SECOND 列的散点图。

#!/exp/anaconda3/bin/python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

file_name = 'junk.csv'

data = pd.read_csv(file_name)

print(data.describe())

plt.rcParams['axes.grid'] = True
fix, axs = plt.subplots(2,2, figsize=(15,10))
axs[0, 0].hist(data['START'], 100, density=True, facecolor='g', alpha=0.8)
axs[1, 0].scatter(data['FIRST'], data['SECOND'], facecolor='violet')
axs[0, 1].hist(data['FIRST'], 100, density=True, facecolor='r', alpha=0.8)
axs[1, 1].hist(data['SECOND'], 100, density=True, facecolor='b', alpha=0.8)
plt.show()

我不明白的是在直方图中,例如,附图中右下角带有蓝色条的图像,为什么它不简单地绘制数字 200 出现的次数而不是显示 200 出现0.10 倍。这怎么可能? 300 也一样。

有人可以帮助我了解 matplot 是什么以及如何得出 Y 轴值的吗?这些值对我来说没有意义。

谢谢。

鲁比·德鲁

【问题讨论】:

    标签: python pandas matplotlib histogram


    【解决方案1】:

    首先请注意,直方图主要用于计算小箱中的连续样本。对于离散数据,应仔细选择 bin,以便在值之间有很好的边界。当您添加bins=N 时,matplotlib 假设一个连续分布,并将空间从最小到最大样本细分为 N 个大小相等的 bin。对于离散数据,这可能会产生意想不到的副作用,例如将样本放入任一 bin 中以获得 bin 边界上的值。

    使用density=True,将重新计算条形的高度,以使所有 bin 的总面积总和为 1。对于具有许多样本的连续分布,这类似于 probability density function,可用于绘制 @987654322 @ 具有相同的 y 轴。

    那么,蓝色直方图中发生了什么:

    • 100300 之间创建了100 个bin。每个 bin 的宽度为 2
    • 3 个 bin 获取值:bin 100-102 的计数为 3,bin 198-200 或 bin 200-202 的计数为 1,bin 298-300 的计数也为 1。
    • bin 的总高度现在为 5。由于它们的宽度为 2,直方图计数需要除以 (total_height * bin_width) 以获得总面积 1。
    • 显然,条形的高度乘以宽度之和为 1:0.3*2 + 0.1*2 + 0.1*2 = 1

    Seaborn 的 histplot 的最新版本 (0.11) 有一个参数来指示分布是离散的。还有一个参数stat=,您可以在'count''probability' 之间进行选择,以指示通常计数的高度,以模仿probability mass function。蓝色直方图可以绘制为:

    import seaborn as sns
    
    sns.histplot(data, x='SECOND', discrete=True, stat='probability', facecolor='b', alpha=0.8, ax=axs[1, 1])
    

    【讨论】:

      【解决方案2】:

      尝试密度 = False。 density 参数告诉 matplotlib 你是否希望它对高度进行归一化以使其代表概率密度。

      【讨论】:

        猜你喜欢
        • 2017-12-12
        • 2013-12-24
        • 2021-03-25
        • 2016-01-02
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多