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

这里使用了三个功能(社区学校?,经济需求指数,学校收入估算)。唯一的分类功能“社区学校?”以代表其级别的绿蓝色显示。 “经济需求指数”和“学校收入估算”分别适用于两个kdeplots。

使用下面显示的代码创建的图像是我可以获得的最佳结果,但是存在问题。

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

python - 用seaborn FacetGrid映射两个子图-LMLPHP
# my dataset looks like:

Community School? / Economic Need Index / School Income Estimate
0   Yes 0.919   31141.72
1   No  0.641   56462.88
2   No  0.744   44342.61
3   No  0.860   31454.00
4   No  0.730   46435.59
5   No  0.858   39415.45
6   No  0.499   43706.73
7   No  0.833   28820.67
8   No  0.849   34889.24
9   No  0.861   35545.10
10  No  0.559   40809.90
11  Yes 0.917   27881.59
12  Yes 0.832   NaN
13  No  0.791   NaN
14  No  0.362   63760.00
15  No  0.771   NaN
16  No  0.451   62519.57
17  No  0.430   57504.48
18  No  0.448   56787.20
19  No  0.764   NaN
20  No  0.610   NaN
21  No  0.257   76833.96
22  No  0.597   NaN
23  No  0.769   32817.79
24  No  0.858   26114.78
25  No  0.176   103399.19
26  No  0.101   144270.13
27  No  0.293   98455.77
28  No  0.430   88011.14
29  No  0.153   102421.46
... ... ... ...

完整的数据集可以找到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')

python - 用seaborn FacetGrid映射两个子图-LMLPHP

10-07 13:31
查看更多