ggplot2 stat function-можем ли мы использовать сгенерированные значения y на других слоях

этот вопрос возник, когда я пытался нарисовать стандартное нормальное распределение с помощью ggplot (легко сделать с stat_function), а также покрасить область под кривой для разных квинтилей -

enter image description here

я смог сделать это с помощью geom_line и geom_ribbon после того, как я создал фрейм данных с диапазоном значений для x и соответствующими значениями dnorm для каждого x как y

    data = data.frame(x=seq(-3,3,length.out=1000))
data$y=dnorm(data$x)
data$Quintile <- with(data,ifelse(x<qnorm(0.2),"Bottom",
                               ifelse(x<qnorm(0.4),"Second",
                                      ifelse(x<qnorm(0.6),"Middle",
                                             ifelse(x<qnorm(0.8),"Fourth","Top")))))
data$Quintile <- factor(data$Quintile, levels=c("Bottom","Second","Middle","Fourth","Top"))

ggplot(data,aes(x=x,y=y,fill=Quintile))+geom_ribbon(aes(ymax=y),ymin=0,alpha=0.5)+
  geom_line(color="black")+theme_bw()+theme(legend.position="bottom")+
  scale_fill_manual(values=c("darkgreen","red","purple","blue","gray"))+
  geom_vline(xintercept=c(qnorm(c(0.2,0.4,0.6,.8))),color=c("darkgreen","red","purple","blue"),size=1)+
  scale_y_continuous("",breaks=NULL)+scale_x_continuous("",breaks=NULL)

Я считаю более привлекательным использовать stat_function, и я думаю, что он должен создавайте свой набор значений y для построения линии - я пытался получить доступ к ним на других слоях, чтобы добавить цветные полосы, но не смог этого сделать - я хочу посмотреть, может ли кто-нибудь объяснить, как это можно сделать или почему мы не можем

другими словами, вместо того, чтобы генерировать данные самостоятельно и использовать geom_line для рисования кривой, я хочу сделать что-то вроде

ggplot(NULL,aes(x=c(-3,3))) + stat_function(fun=dnorm)

и использовать данные, сгенерированные stat_function для выполнения раскраски - я не смог получить доступ к сгенерированным значениям y (я пробовал использовать ..год.. например)

есть ли способ использовать эти значения? если да, то как?

2 ответов


ggplot(NULL,aes(x=c(-3,3))) + 
  stat_function(fun=dnorm, geom="ribbon",
                mapping = aes(ymin=0,ymax=..y..))

вы можете использовать stat_function. См. ссылку ниже для примера.

http://rstudio-pubs-static.s3.amazonaws.com/58753_13e35d9c089d4f55b176057235778679.html

пример сюжета:

enter image description here