2011-08-30 11 views
10

Tworzę wykres w R i potrzebuję utworzyć linię, w której niektóre wartości są rzutowaniem. Projekcje są przedstawione jako linia przerywana. Oto kod:Utwórz częściową przerywaną linię w ggplot2

df = data.frame(date=c(rep(2008:2013, by=1)), 
       value=c(303,407,538,696,881,1094)) 


ggplot(df, aes(date, value, width=0.64)) + 
     geom_bar(stat = "identity", fill="#336699", colour="black") + 
     ylim(c(0,1400)) + opts(title="U.S. Smartphone Users") + 
     opts(axis.text.y=theme_text(family="sans", face="bold")) + 
     opts(axis.text.x=theme_text(family="sans", face="bold")) + 
     opts(plot.title = theme_text(size=14, face="bold")) + 
     xlab("Year") + ylab("Users (in millions)") +   
     opts(axis.title.x=theme_text(family="sans")) + 
     opts(axis.title.y=theme_text(family="sans", angle=90)) + 
     geom_segment(aes(x=2007.6, xend=2013, y=550, yend=1350), arrow=arrow(length=unit(0.4,"cm"))) 

Więc stworzyliśmy linię, która rozciąga się od 2008 do 2013. Jednakże chcę solidną linię od 2008 do 2011 roku, a przerywaną linię od 2011 do końca. Czy po prostu robię dwa oddzielne segmenty linii, czy też istnieje osobne polecenie, którego mogę użyć, aby uzyskać pożądany wynik.

Odpowiedz

20

Filozofia ggplot jest prosta. Każdy element wątku musi znajdować się na innej warstwie. Aby uzyskać dwa segmenty linii w różnych typach linii, potrzebujesz dwóch instrukcji geom_segment.

I ilustrują tę samą zasadę z geom_bar w różnych kolorach dla różnych okresów.

ggplot(df[df$date<=2011, ], aes(date, value, width=0.64)) + 
    geom_bar(stat = "identity", fill="#336699", colour="black") + 
    geom_bar(data=df[df$date>2011, ], aes(date, value), 
     stat = "identity", fill="#336699", colour="black", alpha=0.5) + 
    ylim(c(0,1400)) + opts(title="U.S. Smartphone Users") + 
    opts(
     axis.text.y=theme_text(family="sans", face="bold"), 
     axis.text.x=theme_text(family="sans", face="bold"), 
     plot.title = theme_text(size=14, face="bold"), 
     axis.title.x=theme_text(family="sans"), 
     axis.title.y=theme_text(family="sans", angle=90) 
    ) + 
    xlab("Year") + ylab("Users (in millions)") +   
    geom_segment(aes(x=2007.6, xend=2011, y=550, yend=1050), linetype=1) + 
    geom_segment(aes(x=2011, xend=2013, y=1050, yend=1350), 
     arrow=arrow(length=unit(0.4,"cm")), linetype=2) 

enter image description here

Powiązane problemy