2011-04-29 14 views
5

Ho scritto il seguente codice:ggplot2 geom_line() dovrebbe puntare al valore specificato

library(ggplot2) 

data <- structure(list(x = c(1L, 6L, 3L, 4L, 2L, 3L, 6L, 1L, 5L, 2L, 
        1L, 5L), y = c(1L, 7L, 5L, 6L, 3L, 4L, 6L, 2L, 5L, 6L, 5L, 2L 
      ), year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
          2L, 2L), .Label = c("2010", "2011"), class = "factor"), matching = structure(c(1L, 
          2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("person1", 
          "person2", "person3", "person4", "person5", "person6"), class = "factor")), .Names = c("x", 
      "y", "year", "matching"), row.names = c(NA, -12L), class = "data.frame") 

data$year <- factor(data$year) 

colors <- c("#4cb5ee", "#a0d099", "red") 

p <- ggplot(data, aes(x=x, y=y)) + 
    geom_point(aes(colour=year), shape=16, size=6) + 
    geom_line(aes(group=matching), arrow=arrow(length=unit(0.15,"cm")), colour="black", size=1) + 
    xlab("x") + ylab("y") + 
    scale_colour_manual("year", values=colors) + 
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) + 
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) 

print(p) 

Dà il seguente risultato: plot

Ma quello che voglio geom_line() per fare è: punta sempre al punto in cui l'anno = 2011. Non riesco a capire perché la freccia della linea è punto a volte in un punto che si riferisce all'anno = 2010 e talvolta punti in un punto in cui l'anno = 2011.

Quello che ho scoperto è che freccia richiede diversi argomenti:

arrow(angle = 30, length = unit(0.25, "inches"), ends = "last", type = "open") 

In modo che io potrei dire ends="first". Ma non posso generalizzare che ends è sempre first o sempre last.

Ho provato ad aggiungere una colonna al mio data.frame che ha l'informazione se la freccia dovrebbe finire prima o l'ultima, ma non mi ha dato l'output che volevo.

Ogni aiuto è molto apprezzato :-)

Grazie in anticipo!

risposta

9

geom_path dovrebbe fare il trucco:

p <- ggplot(data, aes(x=x, y=y)) + 
    geom_point(aes(colour=year), shape=16, size=6) + 
    geom_path(aes(group=matching), 
        arrow=arrow(length=unit(0.15,"cm")), 
        colour="black", size=1) + 
    xlab("x") + ylab("y") + 
    scale_colour_manual("year", values=colors) + 
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) + 
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) 

print(p) 

geom_path plot

+0

Si tratta di una soluzione migliore. L'approccio che ho esposto può offrire una certa flessibilità per situazioni più complesse, ma questo è più adatto per il compito da svolgere. – Chase

+1

Mi picchia. Suppongo di dover essere soddisfatto del fatto che io (un utente non ggplot) l'ho messo insieme dall'aiuto in linea. –

+0

Grazie per la tua soluzione, è davvero facile ;-) –

4

C'è probabilmente un modo più efficiente per fare questo, ma un approccio è quello di utilizzare al posto di geom_segment()geom_line(). Questo ti permetterà di specificare i punti di inizio e fine della linea con facilità. Dobbiamo ristrutturare i dati in modo da poter specificare x, y, xend e yend. Ristrutturerò con unire, anche se probabilmente potresti farlo con cast o rimodellamento.

zz <- merge(data[data$year == 2010 ,], data[data$year == 2011 ,] 
    , by = "matching", suffixes = 1:2) 

    matching x1 y1 year1 x2 y2 year2 
1 person1 1 1 2010 6 6 2011 
2 person2 6 7 2010 1 2 2011 
3 person3 3 5 2010 5 5 2011 
4 person4 4 6 2010 2 6 2011 
5 person5 2 3 2010 1 5 2011 
6 person6 3 4 2010 5 2 2011 

Saremo quindi utilizzare due set di dati nella nostra chiamata a ggplot:

ggplot() +              #Blank call to ggplot 
    geom_point(data = data, aes(x=x, y=y, colour=year), shape=16, size=6) + #Points 
    geom_segment(data = zz, aes(x = x1, y = y1, xend = x2, yend = y2),   #Segments 
    arrow = arrow(length = unit(0.15, "cm")), colour = "black", size = 1) + 
    xlab("x") + ylab("y") + 
    scale_colour_manual("year", values=colors) + 
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) + 
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) 
+0

Grazie per il tuo lavoro! Nel mio caso ho bisogno che la soluzione rcs sia pubblicata, perché non voglio ristrutturare i dati. Ma hai ragione, è buono per situazioni complesse :-) –

Problemi correlati