我正在尝试并排生成两个海洋核密度图(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。
答案 0 :(得分:2)
请考虑将您的数据框融为一列,其中包含经济需求指标和学校收入估算的一个值列和一个指标列。然后,在没有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')
答案 1 :(得分:1)
您将获得更多的数字,因为FacetGrid在调用时会自动打开其自己的窗口。有关更多详细信息,请参见对此question的答复。因此,这里是一种更简单的方法。我添加了两条可选行,以每种学校的均值代替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')