Я пытаюсь построить данные типа решетки с помощью ggplot2, а затем наложить нормальное распределение на выборочные данные, чтобы показать, насколько далеки от нормы лежат базовые данные. Я бы хотел, чтобы обычный dist был сверху, чтобы иметь то же значение и stdev, что и на панели.
вот пример:
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)
Все это прекрасно работает и дает хороший трехпанельный график данных. Как мне добавить нормальный dist сверху? Кажется, я бы использовал stat_function, но это не удается:
#this fails
pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + stat_function(fun=dnorm) + facet_wrap(~State_CD)
print(pg)
Похоже, что stat_function не ладит с функцией facet_wrap. Как мне заставить этих двоих хорошо играть?
------------РЕДАКТИРОВАТЬ---------
Я попытался объединить идеи из двух ответов ниже, и я все еще не там:
используя комбинацию обоих ответов, я могу взломать это:
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)
что действительно близко... за исключением того, что что-то не так с нормальным dist:
что я тут не так делаю?