【问题标题】:Frequency Density Graph using pandas使用熊猫的频率密度图
【发布时间】:2019-04-01 17:47:53
【问题描述】:

我创建了一个如下所示的 pandas 数据框

df_hist2 = pd.DataFrame({'Score':np.random.uniform(0,1,4300)}).append(
    pd.DataFrame({'Score':np.random.uniform(1,3,6900)}),ignore_index=True).append(
    pd.DataFrame({'Score':np.random.uniform(3,5,4900)}),ignore_index=True).append(
    pd.DataFrame({'Score':np.random.uniform(5,10,2000)}),ignore_index=True).append(
    pd.DataFrame({'Score':np.random.uniform(10,24,2100)}),ignore_index=True);

我可以从中创建一个直方图,如下所示

df_hist2.plot.hist(bins=[0,1,3,5,10,24], edgecolor='black', linewidth=1.2)

它是这样的

但是,我想创建一个显示频率密度的直方图,而不仅仅是显示频率的位置

频率密度 = 频率 / bin 的宽度

我可以绘制一个条形图,在其中我可以为每个箱(“0-1”、“1-3”等)创建一个类别并手动计算密度。但是,有没有更优雅和简单的方法来做到这一点?

此外,以条形图方式进行操作还需要我首先从数据中计算频率。 (在这种情况下我知道,因为我是手动生成数据,但在真实数据的情况下不知道)

我想要的是有一些东西可以计算和绘制以下内容

Hours   | Frequency | Width | Density       |
--------------------------------------------|
0 - 1   | 4300      | 1     | 4300/1 = 4300 |
1 - 3   | 6900      | 2     | 6900/2 = 3450 |
3 - 5   | 4900      | 2     | 4900/2 = 2450 |
5 - 10  | 2000      | 5     | 2000/5 = 400  |
10 - 24 | 2100      | 14    | 2100/14 = 150 |

还有一个类似于以下内容的图(在 excel 中完成并进行了一些手动编辑)

注意:间隔/bin 的宽度被保留。更改高度以反映频率。

【问题讨论】:

    标签: python pandas histogram frequency


    【解决方案1】:

    下面是一个示例,它可以让您使用直方图参数normed=1 接近您想要的结果,它会为您提供所需的直方图形状。使用matplotlib.pyplot as plt 缩放直方图的高度,然后得到你想要的:

    fig = df_hist2.plot.hist(bins=[0,1,3,5,10,24], edgecolor='black', linewidth=1.2,
                       normed=True) 
    plt.yticks(fig.get_yticks(), [int(x) for x in fig.get_yticks() * len(df_hist2)])
    

    您可以根据自己的喜好进一步自定义 y 刻度的确切值。

    【讨论】:

    • 谢谢!一个小的更新(在我运行了建议的代码之后):现在不推荐使用 normed 参数,并用密度参数代替。干杯!
    猜你喜欢
    • 2018-07-24
    • 2014-02-05
    • 2020-08-25
    • 2015-03-05
    • 2017-05-28
    • 2014-10-30
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多