Как сделать так, чтобы гистограммы в Python (scipy.stats) выглядели так же хорошо, как R?

#python #matplotlib #seaborn #histogram

#python #matplotlib #сиборн #гистограмма

Вопрос:

Следующий график и его код были сгенерированы в R (исходном коде). Как я могу воспроизвести это качество гистограммы в коде Python, используя scipy.stats ?

введите описание изображения здесь

 x = rgamma(1000, 3, .1)
hist(x, prob=T, br=30, col="skyblue2", main="n = 1000: GAMMA(3, .1)")
curve(dgamma(x, 3, .1), add=T, lwd=2, col="orange")
abline(v = 55.81, lwd=2, col="blue")
abline(v = 53.2232, lwd=2, col="brown", lty="dotted")
 

Приведенный выше график R намного лучше, чем гистограммы scipy.stats в Python, один пример показан ниже, но я знаю, что есть альтернативные библиотеки графиков для python

введите описание изображения здесь

 from scipy.stats import dgamma
r = dgamma.rvs(1.1, size=1000)
ax.hist(r, density=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()
 

Комментарии:

1. seaborn.pydata.org/generated/seaborn.histplot.html

2. Я думаю seaborn.histplot , что позволяет вам накладывать только кривую KDE (оценщик плотности ядра), которая является неточной по сравнению с фактическими непрерывными распределениями, подобранными по параметрам scipy.stats . даже код R не использует KDE, он фактически укладывается curve в соответствии с непрерывным распределением dgamma

3. @develarist можете ли вы включить исходные данные, которые вы используете в качестве основы для создания графика, в идеале в формате pandas фрейма данных? Как только вы создадите фрейм данных, вы можете вставить результаты сюда: df.to_dict() предполагая, что вызывается df фрейм данных.

4. источник кода R создал данные как x = rgamma(1000, 3, .1) , в то время как данные в примере Python r = dgamma.rvs(a, size=1000)

5. @develarist Я получаю NameError: name 'a' is not defined

Ответ №1:

Вы можете использовать seaborn histplot kdeplot , если хотите kde , чтобы он был другого цвета. Что касается вашего комментария и того, что kde имеет другой цвет, я прокомментировал этот github здесь, где у кого-то был аналогичный вопрос (я считаю, что это лучший способ сделать это в 2021 году). Итак, мы можем очень близко подойти к тому, что вы опубликовали R , с помощью немного большего количества кода. Есть много других параметров, которые вы можете передать напрямую sns.histplot , и sns.kdeplot или, если параметр не существует, вы можете добавить материал, plt например plt.title('Seaborn Histplot Example') , или добавить материал к осям ax. .

 from scipy.stats import dgamma
import matplotlib.pyplot as plt
import seaborn as sns
r = dgamma.rvs(1.1, size=1000)
sns.set_style("white")
sns.set_context("talk")
fig, ax = plt.subplots(figsize=(24,12))
sns.histplot(r, color='deepskyblue', stat='density')
sns.kdeplot(r, color='orange')
plt.title('Seaborn Histplot Example', size=24, fontweight='bold')
sns.histplot(r, color='deepskyblue', stat='density', edgecolor="black")
sns.kdeplot(r, color='orange')
plt.axvline(2.8, 0, 0.95, color='blue')
plt.axvline(2.4, 0, 0.95, color='brown', linestyle='--')
ax.tick_params(left=True, bottom=True)
plt.show()
 

введите описание изображения здесь

Комментарии:

1. seaborn.distplot будет устаревшим, так что я попробую seaborn.displot(kind='hist') . вы тоже могли бы, если хотите

2. после попытки вашего ответа с displot помощью вместо distplot , настройки цвета с тех пор не работают hist_kws и kde_kws не распознаются. знаете ли вы, как задать цвет черного края и синих полос displot ?

3. @develarist удачное время. Я только что закончил изучать это. Вы правы. Мы должны делать это так, как в 2021 году. Смотрите Обновленный ответ.

4. спасибо за редактирование. Я не думаю curve , что функция R такая же, как sns.kdeplot(r, color='orange') however. По крайней мере, документация ничего не содержит о KDE. не говоря уже о том, что вы должны полностью удалить kdeplot , но стоило бы составить его вместе с любым эквивалентом python curve функции R, чтобы посмотреть, как curve и kdeplot сравнить. rdocumentation.org/packages/graphics/versions/3.6.2/topics /…

5. У @develarist kdeplot есть много опций для настройки кривой с параметрами для bw , bw_adjust , cut , clip . Пожалуйста, смотрите Раздел «Примечания» здесь: seaborn.pydata.org/generated/seaborn.kdeplot.html Честно говоря, при таком уровне детализации кривой это не моя область знаний, и я не R пользователь, поэтому, к сожалению, я не смог бы сравнивать.