python - plots - Representación de la función de densidad de probabilidad por muestra con matplotlib
subplot title python (2)
Quiero trazar una aproximación de la función de densidad de probabilidad basada en una muestra que tengo; La curva que imita el comportamiento del histograma. Puedo tener muestras tan grandes como quiera.
Lo que tienes que hacer es usar gaussian_kde del paquete scipy.stats.kde.
dados tus datos puedes hacer algo como esto:
from scipy.stats.kde import gaussian_kde
from numpy import linspace
# create fake data
data = randn(1000)
# this create the kernel, given an array it will estimate the probability over that values
kde = gaussian_kde( data )
# these are the values over wich your kernel will be evaluated
dist_space = linspace( min(data), max(data), 100 )
# plot the results
plt.plot( dist_space, kde(dist_space) )
La densidad del kernel se puede configurar a voluntad y puede manejar datos de N-dimensional con facilidad. También evitará la distorsión de spline que puede ver en la trama dada por askewchan.
Si desea trazar una distribución y la conoce, defínala como una función y trátela como sigue:
import numpy as np
from matplotlib import pyplot as plt
def my_dist(x):
return np.exp(-x ** 2)
x = np.arange(-100, 100)
p = my_dist(x)
plt.plot(x, p)
plt.show()
Si no tiene la distribución exacta como una función analítica, quizás pueda generar una muestra grande, tomar un histograma y suavizar de alguna manera los datos:
import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt
N = 1000
n = N//10
s = np.random.normal(size=N) # generate your data sample with N elements
p, x = np.histogram(s, bins=n) # bin it into n = N//10 bins
x = x[:-1] + (x[1] - x[0])/2 # convert bin edges to centers
f = UnivariateSpline(x, p, s=n)
plt.plot(x, f(x))
plt.show()
Puede aumentar o disminuir s
(factor de suavizado) dentro de la llamada de la función UnivariateSpline
para aumentar o disminuir el suavizado. Por ejemplo, usando los dos obtienes: