2011-07-24 25 views
8

Ho un insieme di coordinatelinee continue e tratteggiate utilizzando ggplot

(x, y) = (0, 2), (1, 3), (1, 2), (2, 4)  (this is a simplified example) 

Quando v'è un aumento della y-ordinata, desidero unire le coordinate da una linea continua. Ogni volta che c'è una diminuzione dell'ordinata y, mi piacerebbe unire le coordinate con una linea tratteggiata. Nell'esempio sopra,

1.) le coordinate (0, 2) e (1, 3) sono uniti da una linea retta,

2.) le coordinate (1, 3) e (1, 2) sono uniti da una linea tratteggiata e

3.) le coordinate (1, 3) e (2, 4) sono unite da una linea retta.

È possibile farlo utilizzando ggplot in R? Finora, ho potuto avere solo una linea continua che unisce le coordinate. (Se ciò può rendere tutto più semplice, ho solo una diminuzione nell'ordinazione Y quando non vi è alcun cambiamento nell'ordinata x.)

Grazie per il vostro aiuto!

risposta

7

provare questo,

012.
dat <- data.frame(x=c(0,1,1,2),y=c(2,3,2,4)) 

## add endpoints (xend, yend), and and id variable 
## tracking the sign of diff(y) 
dat2 <- with(dat, data.frame(x=x[-length(x)], y=y[-length(y)], 
          id= diff(y) > 0,xend=x[-1], yend=y[-1])) 

head(dat2) 
ggplot(dat2) + 
    geom_segment(aes(x=x, y=y, xend=xend, yend=yend, linetype=id)) + 
    scale_linetype_manual(values=c("dashed", "solid")) 
+0

Per quanto la risposta di @joran sia facile da capire, questa risposta è molto più efficiente nell'esecuzione dell'attività. Grazie anche per il tuo commento. –

+0

+1 per diff (y). –

5

(A cura di rimuovere alcune dichiarazioni potenzialmente fuorvianti ...)

Grazie per questa domanda! In un primo momento ho pensato che sarebbe stato abbastanza orribile, ma poi mi sono ricordato un piccolo trucco su come è possibile memorizzare un gruppo di ggplot componenti in un elenco, e si scopre di non essere poi così male:

#Your example data 
dat <- data.frame(x=c(0,1,1,2),y=c(2,3,2,4)) 

#Initialize the list  
pathList <- vector("list",nrow(dat) - 1) 
#Loop over the data and put the appropriate `geom_line` in each slot 
for (i in 2:nrow(dat)){ 
    if (dat$y[i] - dat$y[i-1] >= 0){ 
     pathList[[i-1]] <- geom_line(data = dat[(i-1):i,],aes(x=x,y=y)) 
    } 
    else{ 
     pathList[[i-1]] <- geom_line(data = dat[(i-1):i,],aes(x=x,y=y), 
           linetype="dashed") 
    } 
} 

p <- ggplot(data=dat,aes(x=x,y=y)) + pathList 

che ha portato in questo:

enter image description here

Come notato nei commenti, però, questa soluzione sta per essere piuttosto inefficiente ...

+0

Grazie mille per il vostro tempo. Funziona bene ed è facile da capire. –

+0

Questa soluzione sarebbe piuttosto inefficiente con un gran numero di segmenti, poiché non utilizza il fatto che la grafica della griglia ha funzioni vettoriali per disegnare più segmenti contemporaneamente con diversi parametri estetici. – baptiste

+0

@baptiste - In effetti, il tuo è molto più bello! – joran

Problemi correlati