Как масштабировать несколько графиков KDE с разными частотами? - PullRequest
2 голосов
/ 22 марта 2020

Я использую Seaborn для построения графиков KDE из двух наборов данных. Но оба KDE уменьшены.

Мой код:

sns.kdeplot(CDMX['EDAD'], shade=True)
sns.kdeplot(eduacion_superior['EDAD'], shade=True)

, который дает мне:

enter image description here

Но я бы хотел, чтобы они масштабировались пропорционально данным, которые они представляют. Итак, что-то вроде:

enter image description here

Есть предложения?

1 Ответ

1 голос
/ 22 марта 2020

Счет может иметь смысл только для некоторых корзин. Насколько я знаю, distplot от Seaborn может показывать гистограмму с количеством отсчетов, но как только вам также понадобится kde, и гистограмма, и kde уменьшаются, чтобы получить общую площадь 1.

Чтобы получить график, аналогичный заданному, стандартный matplotlib может нарисовать kde, рассчитанное с помощью Scipy. Чтобы получить счетчик, нужно решить, каким образом данные будут сгруппированы, так как счетчик зависит от размера бина связанной гистограммы. Простейшим способом было бы иметь одну ячейку на единицу по оси X (то есть по одной на год).

Вот пример кода. Сначала генерируются случайные данные теста. Затем составляются две гистограммы с ячейками в год. На втором графике kde для тех же данных строятся и масштабируются в соответствии с размером набора данных.

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

cdmx_edad = np.random.chisquare(15, 10000)+10
ed_sup_edad = np.random.chisquare(20, 5000)+10

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
bins = np.arange(10,61,1)
ax1.hist(cdmx_edad, bins=bins, color='r', alpha=0.4, label='CDMX edad')
ax1.hist(ed_sup_edad, bins=bins, color='b', alpha=0.4, label='Educación superior edad')
ax1.legend()

cdmx_kde = stats.gaussian_kde(cdmx_edad)
ed_sup_kde = stats.gaussian_kde(ed_sup_edad)
x = np.linspace(10,61,500)
cdmx_curve = cdmx_kde(x)*cdmx_edad.shape[0]
ed_sup_curve = ed_sup_kde(x)*ed_sup_edad.shape[0]
# ax2.plot(x, cdmx_curve, color='r')
ax2.fill_between(x, 0, cdmx_curve, color='r', alpha=0.4, label='CDMX edad')
# ax2.plot(x, ed_sup_curve, color='b')
ax2.fill_between(x, 0, ed_sup_curve, color='b', alpha=0.4, label='Educación superior edad')
ax2.legend()
plt.show()

resulting plot

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