#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)
, в то время как данные в примере Pythonr = 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
, но стоило бы составить его вместе с любым эквивалентом pythoncurve
функции 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
пользователь, поэтому, к сожалению, я не смог бы сравнивать.