сопоставить два участка с морской линией FacetGrid - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь создать два графика плотности ядра морского происхождения (kdeplot) рядом.

Здесь используются три функции (Community School ?, Индекс экономических потребностей, School Income Estimate). Единственная категорическая особенность «Общественная школа?» отображается зелено-голубыми цветами, представляющими его уровни. «Индекс экономической потребности» и «Оценка доходов школ» предназначены для двух 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()

enter image description here

# 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
... ... ... ...

И полный набор данных можно найти здесь .

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Рассмотрите возможность объединения вашего фрейма данных, чтобы иметь один столбец значений и один столбец индикатора для Индикатор экономической необходимости и Оценка дохода школы . Затем построите график без вызова subplots() в matplotlib, только 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

0 голосов
/ 01 июля 2018

Вы получаете дополнительную фигуру, потому что FacetGrid автоматически открывает свое собственное окно при вызове. См. Ответ на этот вопрос для получения дополнительной информации. Здесь, следовательно, более простой подход, который работает. Я добавил две дополнительные строки, чтобы заменить 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')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...