używając stat_function i facet_wrap razem w ggplot2 w R

Próbuję wykreślić dane typu siatki za pomocą ggplot2, a następnie nałożyć rozkład normalny na przykładowe dane, aby zilustrować, jak daleko normalne są dane bazowe. Chciałbym, żeby normalny dist był na górze i miał taki sam średni i stdev jak panel.

Oto przykład:

library(ggplot2)

#make some example data
dd<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(dd) <- c("x_value", "Predicted_value",  "State_CD")

#This works
pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) +  facet_wrap(~State_CD)
print(pg)

To wszystko działa świetnie i tworzy ładny trzy panelowy wykres danych. Jak mogę dodać normalny dist na górze? Wygląda na to, że użyję funkcji stat_function, ale to się nie powiedzie:

#this fails
pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + stat_function(fun=dnorm) +  facet_wrap(~State_CD)
print(pg)

Wygląda na to, że funkcja stat_function nie jest zgodna z funkcją facet_wrap. Jak sprawić, by te dwie osoby grały ładnie?

------------EDYTOWAĆ---------

Próbowałem zintegrować pomysły z dwóch poniższych odpowiedzi i nadal mnie tam nie ma:

używając kombinacji obu odpowiedzi mogę zhakować to razem:

library(ggplot)
library(plyr)

#make some example data
dd<-data.frame(matrix(rnorm(108, mean=2, sd=2),36,2),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(dd) <- c("x_value", "Predicted_value",  "State_CD")

DevMeanSt <- ddply(dd, c("State_CD"), function(df)mean(df$Predicted_value)) 
colnames(DevMeanSt) <- c("State_CD", "mean")
DevSdSt <- ddply(dd, c("State_CD"), function(df)sd(df$Predicted_value) )
colnames(DevSdSt) <- c("State_CD", "sd")
DevStatsSt <- merge(DevMeanSt, DevSdSt)

pg <- ggplot(dd, aes(x=Predicted_value))
pg <- pg + geom_density()
pg <- pg + stat_function(fun=dnorm, colour='red', args=list(mean=DevStatsSt$mean, sd=DevStatsSt$sd))
pg <- pg + facet_wrap(~State_CD)
print(pg)

który jest naprawdę blisko ... poza tym, że coś jest nie tak z normalnym wykresem rozkładu:

co ja tu robię źle?

questionAnswers(5)

yourAnswerToTheQuestion