使用熊猫的频率密度图

时间:2018-10-28 18:06:06

标签: python pandas histogram frequency

我有一个如下所示创建的熊猫数据框

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)

就是这样

enter image description here

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

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

我可以绘制条形图,在其中可以为每个垃圾箱(“ 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的宽度被保留。更改高度以反映频率。

enter image description here

1 个答案:

答案 0 :(得分:2)

下面是一个示例,该示例可以使用直方图参数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刻度的确切值。

enter image description here