Histogramme de superposition avec courbe de densité

J'essaie de faire un histogramme de valeurs de densité et de le superposer à la courbe d'une fonction de densité (pas à l'estimation de densité).

En utilisant un exemple normal standard simple, voici quelques données:

x <- rnorm(1000)

Je peux faire:

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

Mais cela donne l'échelle de l'histogramme en fréquences et non en densités. avec ..density.. je peux obtenir l'échelle appropriée sur l'histogramme:

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

, Mais maintenant cela donne une erreur:

q + stat_function( fun = dnorm )

Y a-t-il quelque chose que je ne suis pas voir?

Une autre question, Existe-t-il un moyen de tracer la courbe d'une fonction, comme curve(), mais pas en tant que couche?

45
demandé sur zx8754 2011-04-16 20:55:14

2 réponses

Voilà!

# 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)
47
répondu Ramnath 2016-06-08 07:32:57

Une alternative plus simple à la réponse de Ramnath, en passant la moyenne observée et l'écart-type, et en utilisant ggplot au lieu 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'
  )

entrez la description de l'image ici

27
répondu Axeman 2018-07-18 08:10:17