En RI puede crear la salida deseada haciendo:
data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))
En python (con matplotlib) lo más cercano que pude fue con un histograma simple:
import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()
También probé el parámetro normed = True pero no pude obtener nada más que intentar ajustar un gaussiano al histograma.
Mis últimos intentos estuvieron presentes scipy.stats
y gaussian_kde
, siguiendo ejemplos en la web, pero hasta ahora no he tenido éxito.
seaborn
stackoverflow.com/a/32803224/1922302Respuestas:
Sven ha mostrado cómo usar la clase
gaussian_kde
de Scipy, pero notarás que no se parece mucho a lo que generaste con R. Esto se debe a quegaussian_kde
intenta inferir el ancho de banda automáticamente. Puede jugar con el ancho de banda de alguna manera cambiando la funcióncovariance_factor
de lagaussian_kde
clase. Primero, esto es lo que obtiene sin cambiar esa función:Sin embargo, si utilizo el siguiente código:
yo obtengo
que está bastante cerca de lo que está obteniendo de R. ¿Qué he hecho?
gaussian_kde
utiliza una función modificablecovariance_factor
para calcular su ancho de banda. Antes de cambiar la función, el valor devuelto por covariance_factor para estos datos era aproximadamente .5. Bajar esto redujo el ancho de banda. Tuve que llamar_compute_covariance
después de cambiar esa función para que todos los factores se calcularan correctamente. No es una correspondencia exacta con el parámetro bw de R, pero es de esperar que le ayude a ir en la dirección correcta.fuente
set_bandwidth
método y unbw_method
argumento de constructor a gaussian_kde en scipy 0.11.0 por número 1619Cinco años después, cuando busqué en Google "cómo crear una gráfica de densidad del kernel usando Python", ¡este hilo todavía aparece en la parte superior!
Hoy en día, una forma mucho más fácil de hacer esto es utilizar seaborn , un paquete que proporciona muchas funciones de trazado convenientes y una buena gestión de estilo.
fuente
bw=0.5
se da?bw
parámetro significa ancho de banda. Estaba tratando de hacer coincidir la configuración de OP (vea su primer ejemplo de código original). Para obtener una explicación detallada de losbw
controles, consulte en.wikipedia.org/wiki/… . Básicamente, controla qué tan suave desea que sea la gráfica de densidad. Cuanto mayor sea el peso corporal, más suave será.TypeError: slice indices must be integers or None or have an __index__ method
Opción 1:
Utilice el
pandas
diagrama de marco de datos (construido sobrematplotlib
):Opcion 2:
Uso
distplot
deseaborn
:fuente
pandas.DataFrame
, puede usarpandas.Series(data).plot(kind='density')
@Anake, no es necesario configurar df.plot.density como un paso separado; puede pasar en subw_method
kwarg apd.Series(data).plot(kind='density', bw_method=0.5)
Tal vez intente algo como:
Puede reemplazarlo fácilmente
gaussian_kde()
por una estimación de densidad de kernel diferente.fuente
La gráfica de densidad también se puede crear usando matplotlib: La función plt.hist (data) devuelve los valores yyx necesarios para la gráfica de densidad (consulte la documentación https://matplotlib.org/3.1.1/api/_as_gen/ matplotlib.pyplot.hist.html ). Como resultado, el siguiente código crea una gráfica de densidad utilizando la biblioteca matplotlib:
Este código devuelve la siguiente gráfica de densidad
fuente