2011-08-30 16 views
10

R'de bir çizim oluşturuyorum ve bazı değerlerin izdüşümü olduğu bir satır oluşturmam gerekiyor. Çıkıntılar kesikli çizgi olarak temsil edilir. İşte kod: ggplot2'de kısmi kesik çizgi oluşturma

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"))) 

Yani 2008'den itibaren Ancak, ben 2008 yılından 2011 yılına sağlam hat istiyorum 2013 kadar uzanır bir çizgi, ve sonuna kadar 2011 yılından kesikli çizgi oluşturduk. Sadece iki ayrı çizgi parçası yapıyorum mu yoksa istenen sonucu almak için kullanabileceğim ayrı bir komut var mı?

cevap

20

ggplot Felsefenin kullanımı kolaydır. Bir arsadaki her elemanın farklı bir katman üzerinde olması gerekir. Bu nedenle, farklı çizgi türlerinde iki satır segmenti elde etmek için iki geom_segment ifadesine ihtiyacınız vardır.

Farklı dönemlerde farklı renklerde geom_bar ile aynı prensibi gösteriyorum.

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