2011-04-16 43 views
41

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

El uso de un ejemplo sencillo normal estándar, aquí es algunos datos:

x <- rnorm(1000) 

que puedo hacer:

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

pero esto da la escala del histograma en frecuencias y no densidades. con ..density.. puedo conseguir la escala apropiada 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 estoy viendo?

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

+1

La cuestión es que haya definido un global y para su trama usando ..density .. inside 'qplot'. Esto confunde 'stat_function'. La solución más fácil sería escribir 'qplot (x, geom = 'blank') + geom_histogram (aes (y = ..density ..)) + stat_function (fun = dnorm)'. Ver mi respuesta detallada debajo de – Ramnath

+1

El equivalente a 'curve (dnorm, -4, 4)' sería 'qplot (x = -4: 4, stat = 'función', fun = dnorm, geom = 'línea')' – Ramnath

+0

Ah, claro, lo intenté con la función como primer argumento pero ahora veo lo que salió mal. ¡Gracias! –

Respuesta

45

¡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) 
+7

P.S. 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 la sintaxis. –

+1

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

+2

@ Jemus42 se puede cambiar la primera línea por algo como esto "ggplot (data.frame (x), aes (x = x)) +" – nzcoops

21

A más escueto alternativo a la respuesta de Ramnath, que pasa a la media observada y la desviación estándar, y el uso de ggplot vez de qplot:

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

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

enter image description here

Cuestiones relacionadas