2011-08-30 35 views
10

Sto creando un grafico in R e ho bisogno di creare una linea in cui alcuni dei valori sono proiezioni. Le proiezioni sono rappresentate come una linea tratteggiata. Ecco il codice:Creare una linea tratteggiata parziale in 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"))) 

Così ho creato una linea che si estende dal 2008 al 2013. Tuttavia, voglio una linea continua dal 2008 al 2011, e una linea tratteggiata dal 2011 fino alla fine. Devo solo fare due segmenti di linea separati, oppure c'è un comando separato che posso usare per ottenere il risultato desiderato.

risposta

20

La filosofia di ggplot è semplice. Ogni elemento di una trama deve essere su un livello diverso. Pertanto, per ottenere due segmenti di linea in diversi tipi di linea, sono necessarie due istruzioni geom_segment.

Ho illustrato lo stesso principio con geom_bar in diversi colori per i diversi periodi.

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

Problemi correlati