在同一个图上将数据框绘制为“hist”和“kde”

Posted

技术标签:

【中文标题】在同一个图上将数据框绘制为“hist”和“kde”【英文标题】:Plotting a dataframe as both a 'hist' and 'kde' on the same plot 【发布时间】:2017-02-20 13:47:50 【问题描述】:

我有一个带有用户信息的熊猫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 轴由频率表示?

【问题讨论】:

【参考方案1】:

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)


回复评论 使用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)

【讨论】:

我已经测试了代码并尝试稍微修改它以满足我的需要。当我只有这两个情节要考虑时,这就是诀窍。当我尝试将其包含到 sublot2grid 中时,它无法产生相同的结果,它只是再现了直方图。 @Lukasz 在任何情况下你都想使用相同的ax【参考方案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])

希望对你有帮助:)

【讨论】:

【参考方案3】:

使用seaborn.displot 会更好,甚至更简单。之前提出的解决方案让 KDE 情节对我来说有点“上移”。 seaborn.distplot 在 hist 和 kde 图之间准确排列零。 import seaborn as sns sns.displot(df.a)

【讨论】:

以上是关于在同一个图上将数据框绘制为“hist”和“kde”的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制条形图,显示由数据框列组成的各种桶的频率计数?

使用 pandas 或 matplotlib 在 IPython 笔记本中绘制性别图表

如何使用 Pandas 绘制条形图?

R - 在ggplot 2上将两个变量绘制为线条[重复]

绘制熊猫 DataframeGroupbySeries 的 HIST

如何为来自同一个熊猫数据框的所有不同列制作单独的 Seaborn kde 图?