J'essaie de faire un peu de traçage et d'ajustement de distribution dans Python en utilisant SciPy pour les statistiques et matplotlib pour le traçage. J'ai de la chance avec certaines choses comme la création d'un histogramme:
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)
Brillant!
Je peux même prendre les mêmes paramètres gamma et tracer la fonction linéaire de la fonction de distribution de probabilité (après quelques recherches sur Google):
rv = ss.gamma(5,100,22)
x = np.linspace(0,600)
h = plt.plot(x, rv.pdf(x))
Comment pourrais-je tracer l'histogramme myHist
avec la ligne PDF h
superposée au-dessus de l'histogramme? J'espère que c'est trivial, mais je ont été incapables de le comprendre.
il suffit de mettre les deux pièces ensemble.
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()
pour vous assurer d'obtenir ce que vous voulez dans une instance de tracé spécifique, essayez de créer d'abord un objet 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()
On pourrait être intéressé à tracer la fonction de distribution de tout histogramme. Cela peut être fait en utilisant la fonction 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()
d'un cours coursera sur la visualisation de données avec python
Développant la réponse de Malik et essayant de s'en tenir à Vanilla NumPy, SciPy et Matplotlib. J'ai intégré Seaborn, mais il n'est utilisé que pour fournir des paramètres par défaut plus agréables et de petits ajustements visuels:
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()
nous donne l'intrigue suivante:
J'ai essayé de m'en tenir à un ensemble de fonctionnalités minimal tout en produisant une sortie relativement agréable, notamment en utilisant SciPy pour estimer que KDE est très facile.