two plots one multiple python matplotlib histogram probability

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: