我正在尝试并排生成两个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()
# 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')