использование stat_function и facet_wrap вместе в ggplot2 в R

Для контейнерной независимости

22
задан JD Long 1 May 2018 в 00:52
поделиться

3 ответа

stat_function предназначен для наложения одной и той же функции на каждой панели. (Нет очевидного способа согласовать параметры функции с различными панелями.)

Как предлагает Ян, лучший способ - это создать нормальные кривые самостоятельно и построить их как отдельный набор данных (именно здесь вы раньше ошибались - слияние просто не имеет смысла для этого примера, и если вы посмотрите внимательно, то увидите, почему вы получаете странный образец пилообразной формы).

Вот как я подхожу к решению проблемы:

dd <- data.frame(
  predicted = rnorm(72, mean = 2, sd = 2),
  state = rep(c("A", "B", "C"), each = 24)
) 

grid <- with(dd, seq(min(predicted), max(predicted), length = 100))
normaldens <- ddply(dd, "state", function(df) {
  data.frame( 
    predicted = grid,
    density = dnorm(grid, mean(df$predicted), sd(df$predicted))
  )
})

ggplot(dd, aes(predicted))  + 
  geom_density() + 
  geom_line(aes(y = density), data = normaldens, colour = "red") +
  facet_wrap(~ state) 

enter image description here

35
ответ дан 29 November 2019 в 04:40
поделиться

Я думаю, что лучше всего провести линию вручную с помощью geom_line.

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")
dd$Predicted_value<-dd$Predicted_value*as.numeric(dd$State_CD) #make different by state

##Calculate means and standard deviations by level
means<-as.numeric(by(dd[,2],dd$State_CD,mean))
sds<-as.numeric(by(dd[,2],dd$State_CD,sd))

##Create evenly spaced evaluation points +/- 3 standard deviations away from the mean
dd$vals<-0
for(i in 1:length(levels(dd$State_CD))){
    dd$vals[dd$State_CD==levels(dd$State_CD)[i]]<-seq(from=means[i]-3*sds[i], 
                            to=means[i]+3*sds[i],
                            length.out=sum(dd$State_CD==levels(dd$State_CD)[i]))
}
##Create normal density points
dd$norm<-with(dd,dnorm(vals,means[as.numeric(State_CD)],
                        sds[as.numeric(State_CD)]))


pg <- ggplot(dd, aes(Predicted_value)) 
pg <- pg + geom_density() 
pg <- pg + geom_line(aes(x=vals,y=norm),colour="red") #Add in normal distribution
pg <- pg + facet_wrap(~State_CD,scales="free")
pg
1
ответ дан 29 November 2019 в 04:40
поделиться

Думаю, вам нужно предоставить больше информации. Кажется, это работает:

 pg <- ggplot(dd, aes(Predicted_value)) ## need aesthetics in the ggplot
 pg <- pg + geom_density() 
 ## gotta provide the arguments of the dnorm
 pg <- pg + stat_function(fun=dnorm, colour='red',            
            args=list(mean=mean(dd$Predicted_value), sd=sd(dd$Predicted_value)))
 ## wrap it!
 pg <- pg + facet_wrap(~State_CD)
 pg

Мы предоставляем одинаковые значения среднего и стандартного отклонения для каждой панели. Получение специальных средств панели и стандартных отклонений оставлено в качестве упражнения для читателя *;)

'*' Другими словами, не знаю, как это можно сделать ...

3
ответ дан 29 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: