Superposición de histograma con curva de densidad

Estoy tratando de hacer un histograma de valores de densidad y superponerlo con la curva de una función de densidad (no la estimación de densidad).

Usando un ejemplo normal estándar simple, aquí hay algunos datos:

x <- rnorm(1000)

Puedo hacer:

q <- qplot( x, geom="histogram")
q + stat_function( fun = dnorm )

pero esto da la escala del histograma en frecuencias y no en densidades. con ..density.. Puedo obtener la escala adecuada en el histograma:

q <- qplot( x,..density.., geom="histogram")
q

Pero ahora esto da un error:

q + stat_function( fun = dnorm )

¿Hay algo que no veo?

Otra pregunta, ¿hay alguna manera de trazar la curva de una función, como curve(), pero luego no como capa?

preguntado el 16 de abril de 11 a las 13:04

El problema es que ha definido una y global para su parcela usando ..density .. inside qplot. Esto confunde stat_function. La solución más sencilla sería escribir qplot(x, geom = 'blank') + geom_histogram(aes(y = ..density..)) + stat_function(fun = dnorm). Vea mi respuesta detallada a continuación:

El equivalente a curve(dnorm, -4, 4) sería qplot(x = -4:4, stat = 'function', fun = dnorm, geom = 'line') -

Ah, cierto, lo intenté con la función como primer argumento, pero vea ahora qué salió mal. ¡Gracias! -

3 Respuestas

Aquí tienes!

# create some data to work with
x = rnorm(1000);

# overlay histogram, empirical density and normal density
p0 = qplot(x, geom = 'blank') +   
  geom_line(aes(y = ..density.., colour = 'Empirical'), stat = 'density') +  
  stat_function(fun = dnorm, aes(colour = 'Normal')) +                       
  geom_histogram(aes(y = ..density..), alpha = 0.4) +                        
  scale_colour_manual(name = 'Density', values = c('red', 'blue')) + 
  theme(legend.position = c(0.85, 0.85))

print(p0)

Respondido el 08 de junio de 16 a las 08:06

PD Si uno trabaja con datos reales, asegúrese de pasar la media empírica y los argumentos sd a la función dnorm, consulte la ayuda de stat_function para conocer la sintaxis. - Maxim.K

Solo por curiosidad: ¿Cómo se haría esto usando la función ggplot ()? Apenas entendí la forma en que funciona ggplot (), así que me siento un poco raro al usar este enfoque para mis cosas. - Jemus42

@ Jemus42 podrías cambiar la primera línea por algo como "ggplot (data.frame (x), aes (x = x)) +" - nzcoops

@ Jemus42 ¿Por qué? Sin pasar mean y sd en argumentos a stat_function, no obtengo nada en absoluto. - Shaun jackman

Existe un problema con la superposición de histogramas y estimaciones de densidad, que es que las estimaciones de densidad realmente deberían cambiarse la mitad de un ancho de intervalo para lograr la presentación más precisa y estéticamente agradable. No he podido averiguar cómo hacer esto. ¿Ningún arrendatario? - soleado

Una alternativa más básica a la respuesta de Ramnath, pasando la media observada y la desviación estándar, y usando ggplot en lugar de qplot:

df <- data.frame(x = rnorm(1000, 2, 2))

# overlay histogram and normal density
ggplot(df, aes(x)) +
  geom_histogram(aes(y = stat(density))) +
  stat_function(
    fun = dnorm, 
    args = list(mean = mean(df$x), sd = sd(df$x)), 
    lwd = 2, 
    col = 'red'
  )

enter image description here

Respondido 18 Jul 18, 09:07

Esta es una respuesta muy conveniente, ya que proporciona una forma de trazar un histograma y una curva de densidad incluso cuando pertenecen a diferentes distribuciones, si es necesario (como lo fue para mí). ¡Gracias! - elcortegano

¿Qué pasa con el uso geom_density() de ggplot2? Al igual que:

df <- data.frame(x = rnorm(1000, 2, 2))

ggplot(df, aes(x)) + geom_histogram(aes(y=..density..)) + geom_density(col = "red")

Respondido 14 Feb 19, 22:02

Porque OP pidió "la curva de una función de densidad (no la estimación de densidad)". geom_density da la densidad estimada. - Axeman

Tal vez no sea lo que pidió el OP, ¡pero esto ayudó con lo que estaba buscando! - David C

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.