Representación de la función de densidad de probabilidad por muestra con matplotlib

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 histogtwig. Puedo tener muestras tan grandes como quiera.

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 histogtwig y de alguna manera suavizar 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 boost o disminuir s (factor de suavizado) dentro de la llamada de la función UnivariateSpline para boost o disminuir el suavizado. Por ejemplo, usando los dos obtienes: dist to func

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 ttwig dada por askewchan.

introduzca la descripción de la imagen aquí