2012-07-03 54 views
9

Estoy tratando de hacer un poco de distribución de trazado y ajuste en Python usando SciPy para las estadísticas y matplotlib para el trazado. Estoy teniendo buena suerte con algunas cosas como la creación de un histograma:python: trazado de un histograma con una línea de función en la parte superior

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!

incluso puedo tener los mismos parámetros gamma y representar gráficamente la función de línea de la función de distribución de probabilidad (después de algunas google):

rv = ss.gamma(5,100,22) 
x = np.linspace(0,600) 
h = plt.plot(x, rv.pdf(x)) 

enter image description here

¿Cómo hago para trazar el histograma myHist con la línea PDF h superpuesta sobre la parte superior del histograma? Espero que esto sea trivial, pero no he podido resolverlo.

+1

http://matplotlib.sourceforge.net/examples/api/histogram_demo.html – jfs

+0

Usted' Probablemente trazando el histograma y la trama en diferentes figuras. Si simplemente llama a la función hist y plot en la misma figura, entonces el 2 debería superponerse – Dhara

+0

@Dhara, que era exactamente eso. Estoy usando una notebook ipython y estoy haciendo exactamente eso. –

Respuesta

10

solo junta las dos piezas.

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

para asegurarse de que obtiene lo que quiere en cualquier instancia trama específica, tratar de crear un objeto figure primera

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

el problema que me encontré fue que estoy usando una notebook ipython, así que corría una trama, trazaría de forma interactiva, luego haría algunas cosas y trazaría otra, y terminaría en una nueva trama. ¡Gracias por ayudarme a resolver esto! –

2

Por podría estar interesado en el trazado de la función distibution de cualquier histograma Esto se puede hacer usando la función 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 de un curso de Coursera en la visualización de datos con el pitón

Cuestiones relacionadas