将数据帧绘制为' hist'和' kde'在同一个地块上

时间:2016-10-11 21:29:36

标签: python pandas matplotlib plot dataframe

我有一个带有用户信息的panda dataframe。我想在同一个图上将用户的年龄绘制为kind='kde'kind='hist'。目前我能够拥有两个独立的情节。数据框类似于:

member_df=    
user_id    Age
1          23
2          34
3          63 
4          18
5          53  
...

使用

ax1 = plt.subplot2grid((2,3), (0,0))
member_df.Age.plot(kind='kde', xlim=[16, 100])
ax1.set_xlabel('Age')

ax2 = plt.subplot2grid((2,3), (0,1))
member_df.Age.plot(kind='hist', bins=40)
ax2.set_xlabel('Age')

ax3 = ...

我知道kind='kde'会给我y轴的频率,而kind='kde'会给出累积分布,但有没有办法将两者结合起来并让y轴表示为频率?

3 个答案:

答案 0 :(得分:10)

pd.DataFrame.plot()会返回它正在绘制的ax。您可以将其重复用于其他图表。

尝试:

ax = member_df.Age.plot(kind='kde')
member_df.Age.plot(kind='hist', bins=40, ax=ax)
ax.set_xlabel('Age')

<强> 例如
我首先绘制hist以放入背景中 另外,我将kde放在secondary_y轴上

import pandas as pd
import numpy as np


np.random.seed([3,1415])
df = pd.DataFrame(np.random.randn(100, 2), columns=list('ab'))

ax = df.a.plot(kind='hist')
df.a.plot(kind='kde', ax=ax, secondary_y=True)

enter image description here

对评论的回复
使用subplot2grid。只需重用ax1

import pandas as pd
import numpy as np

ax1 = plt.subplot2grid((2,3), (0,0))

np.random.seed([3,1415])
df = pd.DataFrame(np.random.randn(100, 2), columns=list('ab'))

df.a.plot(kind='hist', ax=ax1)
df.a.plot(kind='kde', ax=ax1, secondary_y=True)

enter image description here

答案 1 :(得分:2)

如果您想要数据框的所有列:

fig, ax = plt.subplots(8,3, figsize=(20, 50)) 
# you can change the distribution, I had 22 columns, so 8x3 is fine to me
fig.subplots_adjust(hspace = .2, wspace=.2, )

ax = ax.ravel()

for i in range(len(I_df.columns)):
    ax[i] = I_df.iloc[:,i].plot(kind='hist', ax=ax[i])
    ax[i] = I_df.iloc[:,i].plot(kind='kde', ax=ax[i], secondary_y=True)
    plt.title(I_df.columns[i])

我希望它有所帮助:)

答案 2 :(得分:0)

使用seaborn.displot更好甚至更简单。先前提出的解决方案使KDE图对我来说似乎有些“移位”。 seaborn.distplot在历史图和kde图之间准确地将零对齐。
import seaborn as sns sns.displot(df.a)