wake-up-neo.com

Überlagerungshistogramm mit Dichtekurve

Ich versuche, ein Histogramm der Dichtewerte zu erstellen und dieses mit der Kurve einer Dichtefunktion zu überlagern (nicht der Dichteschätzung).

An einem einfachen Standardbeispiel werden hier einige Daten dargestellt:

x <- rnorm(1000)

Ich kann:

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

dies gibt jedoch die Skala des Histogramms in Frequenzen und nicht in Dichten an. mit ..density.. kann ich die richtige Skala im Histogramm erhalten:

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

Aber jetzt gibt es einen Fehler:

q + stat_function( fun = dnorm )

Gibt es etwas, was ich nicht sehe?

Eine andere Frage: Gibt es eine Möglichkeit, die Kurve einer Funktion wie curve() darzustellen, aber dann nicht als Ebene?

46
Sacha Epskamp

Bitte schön!

# 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
Ramnath

Eine andere Alternative zu Ramnath, die den beobachteten Mittelwert und die Standardabweichung übertrifft und statt ggplotqplot verwendet:

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

31
Axeman

Was ist mit geom_density() von ggplot2? So wie:

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

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