Python 使用seaborn FaceGrid映射两个子地块
我试图同时生成两个seaborn内核密度图(Python 使用seaborn FaceGrid映射两个子地块,python,seaborn,Python,Seaborn,我试图同时生成两个seaborn内核密度图(kdeplot) 这里使用了三个特征(社区学校?、经济需求指数、学校收入估算)。唯一的分类特征“社区学校”显示为代表其等级的绿蓝色“经济需求指数”和“学校收入估算”分别适用于两个KDE地块 使用下面显示的代码创建的图像是我能得到的最佳结果,但它有问题 1) 第二个绘图的y轴比例错误(它应该是与第一个绘图类似的整数比例)更正:kdeplot已赋范(所有项合计为1),因此y轴在给定其x值时是正确的 2) 沿两个图下方产生一个额外的轴(?) 3) 我想为每个
kdeplot
)
这里使用了三个特征(社区学校?、经济需求指数、学校收入估算)。唯一的分类特征“社区学校”显示为代表其等级的绿蓝色“经济需求指数”和“学校收入估算”分别适用于两个KDE地块
使用下面显示的代码创建的图像是我能得到的最佳结果,但它有问题
1) 第二个绘图的y轴比例错误(它应该是与第一个绘图类似的整数比例)更正:kdeplot
已赋范(所有项合计为1),因此y轴在给定其x值时是正确的
2) 沿两个图下方产生一个额外的轴(?)
3) 我想为每个子地块添加一个标题
我发现kdeplot
不支持hue
,所以我尝试使用FacetGrid
。不确定这样做是否正确。如果能提供更好的方法,我们将不胜感激
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.subplots_adjust(wspace=.8)
fg = sns.FacetGrid(df, hue='Community School?', size=3)
fg.map(sns.kdeplot, 'Economic Need Index', shade=True, ax=ax1, label='Economic Need Index')
fg.map(sns.kdeplot, 'School Income Estimate', shade=True, ax=ax2, label='School Income Estimate')
plt.show()
并且可以找到完整的数据集。您将获得额外的数字,因为FaceGrid在调用时会自动打开自己的窗口。有关更多详细信息,请参阅此问题的答案。因此,这里有一个更简单的方法。我添加了两条可选行,用每种类型学校的平均数替换NAN
s = df.groupby(['Community School?'])['School Income Estimate'].transform('mean')
df['School Income Estimate'].fillna(s, inplace=True)
plt.subplots(1, 2)
plt.subplot(1, 2, 1)
a = sns.kdeplot(df.loc[df['Community School?'] == 'No', 'Economic Need Index'], shade=True, label='No')
b = sns.kdeplot(df.loc[df['Community School?'] == 'Yes', 'Economic Need Index'], color= 'red', shade=True, label='Yes')
plt.title('KDE of Economic Need Index')
plt.subplot(1, 2, 2)
c = sns.kdeplot(df.loc[df['Community School?'] == 'No', 'School Income Estimate'], shade=True, label='No')
d = sns.kdeplot(df.loc[df['Community School?'] == 'Yes', 'School Income Estimate'], color= 'red', shade=True, label='Yes')
plt.title('KDE of School Income Estimate')
考虑将数据框合并为一个值列和一个指标列,用于经济需求指标和学校收入估计。然后,在不使用matplotlib的
子绘图()调用的情况下进行绘图,仅使用seaborn的FaceGrid
并调整默认绘图属性:
long_df = pd.melt(df, id_vars='Community School?', var_name='Indicator', value_name='value')
print(long_df.head())
# Community School? Indicator value
# 0 Yes Economic Need Index 0.919
# 1 No Economic Need Index 0.641
# 2 No Economic Need Index 0.744
# 3 No Economic Need Index 0.860
# 4 No Economic Need Index 0.730
fg = sns.FacetGrid(long_df, col='Indicator', hue='Community School?',
sharex=False, sharey=False, size=4)
fg.map(sns.kdeplot, 'value', shade=True, label='Data')\
.add_legend()\
.set_titles("{col_name}")\
.set_axis_labels('')
plt.show()
plt.clf()
plt.close('all')
long_df = pd.melt(df, id_vars='Community School?', var_name='Indicator', value_name='value')
print(long_df.head())
# Community School? Indicator value
# 0 Yes Economic Need Index 0.919
# 1 No Economic Need Index 0.641
# 2 No Economic Need Index 0.744
# 3 No Economic Need Index 0.860
# 4 No Economic Need Index 0.730
fg = sns.FacetGrid(long_df, col='Indicator', hue='Community School?',
sharex=False, sharey=False, size=4)
fg.map(sns.kdeplot, 'value', shade=True, label='Data')\
.add_legend()\
.set_titles("{col_name}")\
.set_axis_labels('')
plt.show()
plt.clf()
plt.close('all')