2014-10-08 12 views
8

To pytanie pojawiło się, gdy próbowałem narysować standardowy rozkład normalny za pomocą ggplot (łatwe do wykonania przy użyciu funkcji stat_function), a także pokolorować obszar pod krzywą dla różnych kwintyli -ggplot2 stat_function - czy możemy użyć wygenerowanych wartości y na innych warstwach

enter image description here

że w stanie to zrobić z geom_line i geom_ribbon po utworzonego ramkę danych z różnych wartości X i odpowiednie wartości dnorm dla każdego X, jak 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) 

i płetwa d bardziej zachęca do korzystania z funkcji stat_function i domyślam się, że musi tworzyć swój zestaw wartości y, aby narysować linię - próbowałem uzyskać dostęp do tych na innych warstwach, aby dodać kolorowe paski, ale nie mogłem tego zrobić - chcę zobaczyć czy ktoś potrafi wyjaśnić, jak to można zrobić i dlaczego nie możemy

innymi słowy zamiast generowania danych siebie i używać geom_line narysować krzywą, chcę zrobić coś podobnego

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

i wykorzystania dane wygenerowane przez funkcję stat_ do kolorowania - nie byłem w stanie uzyskać dostępu do wygenerowanych wartości y (próbowałem użyć na przykład ..y ..)

Czy istnieje sposób na wykorzystanie tych wartości? Jeśli tak to jak?

+2

Będziesz łatwiej pomóc, jeśli podasz kod używany do tworzenia ramki danych i narysować wykres. – eipi10

Odpowiedz

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

Dzięki, ale to działa aż do poziomu - możesz pokolorować całą krzywą w ten sposób - ale chodzi o to, aby kolorować kwartyle lub kwintyle w różnych kolorach - jak jeden kolor mógłby powiedzieć obszar od -3 do 0 jednego koloru i obszaru od zera do innego z oceną – user1617979

+0

wątpię, czy to możliwe, funkcja stat_function nie wydaje się dobrze współgrać z ideą mapowania estetycznego. Prawdopodobnie będziesz musiał utworzyć dane poza ggplot. – baptiste

+0

Baptysta, dzięki za odpowiedź. Naprawdę chciałem tylko sprawdzić, czy jest to "eleganckie" rozwiązanie bez tworzenia danych - zawsze staram się pisać mniej kodu, kiedy to tylko możliwe – user1617979

Powiązane problemy