用seaborn FaceGrid映射两个子图

2024-05-20 19:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试同时生成两个seaborn内核密度图(kdeplot)。在

三大特色(社区学校?,经济需求指数,学校收入估算)。唯一明确的特征是“社区学校?”显示为代表其水平的绿蓝色“经济需求指数”和“学校收入估计”分别适用于两个KDeplot。在

使用下面显示的代码创建的图像是我能得到的最好的结果,但是它有问题。在

1)第二个绘图的y轴刻度错误(它应该像第一个绘图一样是一些整数刻度)更正:kdeplot是赋范的(所有的加起来都是1),所以y轴在给定x值的情况下是正确的。在

2)一个额外的轴(?)在这两块地下面

3)我想为每个子批次添加一个标题

我发现kdeplot不支持hue,所以我试图让它与{}一起工作。不确定这是不是正确的方法。如能提供更好的方法,将不胜感激。在

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()

enter image description here

^{pr2}$

可以找到完整的数据集here。在


Tags: 方法绘图fig经济指数hue社区学校
2条回答

您将获得额外的图形,因为FacetGrid在调用时会自动打开自己的窗口。有关详细信息,请参阅此question的答案。因此,这里有一个更简单的方法。我添加了两个可选行,用每种类型的学校的平均数代替NaNs。在

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')

enter image description here

考虑将您的数据框架融合为一个值列和一个指标列,分别用于经济需求指标学校收入估计值。然后,在不使用matplotlib的subplots()调用的情况下绘图,只使用seaborn的FacetGrid调用,并对默认绘图属性进行调整:

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')

Facet Grid Output

相关问题 更多 >