在同一个图上将数据框绘制为“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 笔记本中绘制性别图表