Python: построение гистограммы с помощью функциональной линии сверху
Я пытаюсь сделать небольшой график распределения и подгонки в Python, используя SciPy для статистики и matplotlib для построения графика. Мне повезло с такими вещами, как создание гистограммы:
seed(2)
alpha=5
loc=100
beta=22
data=ss.gamma.rvs(alpha,loc=loc,scale=beta,size=5000)
myHist = hist(data, 100, normed=True)
![enter image description here]()
Brilliant!
Я могу даже взять одни и те же параметры гаммы и построить линейную функцию функции распределения вероятности (после некоторого googling):
rv = ss.gamma(5,100,22)
x = np.linspace(0,600)
h = plt.plot(x, rv.pdf(x))
![enter image description here]()
Как мне поместить график гистограммы myHist
с линией PDF h
, наложенной поверх гистограммы? Я надеюсь, что это тривиально, но я не смог понять это.
Ответы
Ответ 1
просто соедините обе части.
import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt
alpha, loc, beta=5, 100, 22
data=ss.gamma.rvs(alpha,loc=loc,scale=beta,size=5000)
myHist = plt.hist(data, 100, normed=True)
rv = ss.gamma(alpha,loc,beta)
x = np.linspace(0,600)
h = plt.plot(x, rv.pdf(x), lw=2)
plt.show()
![enter image description here]()
чтобы убедиться, что вы получаете то, что хотите, в каком-либо конкретном экземпляре сюжета, сначала попытайтесь создать объект figure
import scipy.stats as ss
import numpy as np
import matplotlib.pyplot as plt
# setting up the axes
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111)
# now plot
alpha, loc, beta=5, 100, 22
data=ss.gamma.rvs(alpha,loc=loc,scale=beta,size=5000)
myHist = ax.hist(data, 100, normed=True)
rv = ss.gamma(alpha,loc,beta)
x = np.linspace(0,600)
h = ax.plot(x, rv.pdf(x), lw=2)
# show
plt.show()
Ответ 2
Кто-то может быть заинтересован в построении функции распределения любой гистограммы. Это можно сделать с seaborn kde
функции seaborn kde
import numpy as np # for random data
import pandas as pd # for convinience
import matplotlib.pyplot as plt # for graphics
import seaborn as sns # for nicer graphics
v1 = pd.Series(np.random.normal(0,10,1000), name='v1')
v2 = pd.Series(2*v1 + np.random.normal(60,15,1000), name='v2')
# plot a kernel density estimation over a stacked barchart
plt.figure()
plt.hist([v1, v2], histtype='barstacked', normed=True);
v3 = np.concatenate((v1,v2))
sns.kdeplot(v3);
plt.show()
из курса Coursera по визуализации данных с помощью Python
Ответ 3
расширяя ответ Малика, и пытаясь придерживаться ванильных NumPy, SciPy и Matplotlib. Я также использовал Seaborn, чтобы обеспечить более хорошие настройки по умолчанию, но он использовался только для небольших визуальных настроек:
import numpy as np
import scipy.stats as sps
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='ticks')
# parameterise our distributions
d1 = sps.norm(0, 10)
d2 = sps.norm(60, 15)
# sample values from above distributions
y1 = d1.rvs(300)
y2 = d2.rvs(200)
# combine mixture
ys = np.concatenate([y1, y2])
# create new figure with size given explicitly
plt.figure(figsize=(10, 6))
# add histogram showing individual components
plt.hist([y1, y2], 31, histtype='barstacked', density=True, alpha=0.4, edgecolor='none')
# get X limits and fix them
mn, mx = plt.xlim()
plt.xlim(mn, mx)
# add our distributions to figure
x = np.linspace(mn, mx, 301)
plt.plot(x, d1.pdf(x) * (len(y1) / len(ys)), color='C0', ls='--', label='d1')
plt.plot(x, d2.pdf(x) * (len(y2) / len(ys)), color='C1', ls='--', label='d2')
# estimate Kernel Density and plot
kde = sps.gaussian_kde(ys)
plt.plot(x, kde.pdf(x), label='KDE')
# finish up
plt.legend()
plt.ylabel('Probability density')
sns.despine()
это дает нам следующий сюжет:
![money shot]()
Я пытался придерживаться минимального набора функций, получая при этом относительно хороший вывод, особенно используя SciPy, чтобы оценить KDE очень просто.