我有一个如下所示创建的熊猫数据框
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)
就是这样
但是,我想创建一个直方图来显示频率密度,而不仅仅是频率。
频率密度=频率/箱的宽度
我可以绘制条形图,在其中可以为每个垃圾箱(“ 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的宽度被保留。更改高度以反映频率。
答案 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刻度的确切值。