web-dev-qa-db-fra.com

python: traçage d'un histogramme avec une ligne de fonction en haut

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)

enter image description here

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))

enter image description here

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.

16
JD Long

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()

enter image description here

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()
16
nye17

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()

enter image description here d'un cours coursera sur la visualisation de données avec python

4
Malik Koné

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:

money shot

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.

1
Sam Mason