2011-08-30 40 views
10

Tôi đang tạo một ô trong R và cần tạo một dòng nơi một số giá trị là các phép chiếu. Các phép chiếu được biểu diễn dưới dạng đường đứt nét. Dưới đây là các mã:Tạo một đường đứt nét một phần trong 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"))) 

Vì vậy, tôi đã tạo ra một dòng mà kéo dài từ năm 2008 đến năm 2013. Tuy nhiên, tôi muốn có một đường liền mạch từ năm 2008 đến năm 2011, và một dòng tiêu tan từ năm 2011 đến cuối. Do tôi chỉ làm hai phân đoạn dòng riêng biệt, hoặc là có một lệnh riêng biệt tôi có thể sử dụng để có được kết quả mong muốn.

Trả lời

20

Bản sao ggplot rất đơn giản. Mỗi phần tử của ô cần phải nằm trên một lớp khác. Do đó, để có hai phân đoạn đường thẳng trong các loại đường khác nhau, bạn cần có hai câu lệnh geom_segment.

Tôi minh họa nguyên tắc tương tự với geom_bar bằng các màu khác nhau cho các giai đoạn khác nhau của bạn.

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

Các vấn đề liên quan