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.statsy gaussian_kde, siguiendo ejemplos en la web, pero hasta ahora no he tenido éxito.

seabornstackoverflow.com/a/32803224/1922302Respuestas:
Sven ha mostrado cómo usar la clase
gaussian_kdede Scipy, pero notarás que no se parece mucho a lo que generaste con R. Esto se debe a quegaussian_kdeintenta inferir el ancho de banda automáticamente. Puede jugar con el ancho de banda de alguna manera cambiando la funcióncovariance_factorde lagaussian_kdeclase. 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_kdeutiliza una función modificablecovariance_factorpara 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_covariancedespué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_bandwidthmétodo y unbw_methodargumento 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.5se da?bwpará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 losbwcontroles, 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__ methodOpción 1:
Utilice el
pandasdiagrama de marco de datos (construido sobrematplotlib):Opcion 2:
Uso
distplotdeseaborn: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_methodkwarg 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