2016-06-24 24 views
15

Sto creando un grafico ggplot dove voglio avere delle frecce tra due punti. L'attività principale è facilmente eseguibile con geom_line(arrow = arrow()). Tuttavia, voglio avere alcune "belle" frecce spesse. Il ridimensionamento della freccia tramite size= non aiuta poiché danneggia completamente la punta della freccia. Illustro i miei problemi:Come disegnare una bella freccia in ggplot2

creare alcuni dati di esempio e una trama:

NAME <- c("A", "A", "B", "B", "C", "C") 
YEAR <- c(2016, 2011, 2016, 2011, 2016, 2011) 
YEAR <- as.factor(YEAR) 
VALUE <- c(1, 4, 1, 5, 2, 8) 
DATA <- data.frame(NAME, YEAR, VALUE) 

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
    geom_point(size=5, aes(colour=YEAR)) + 
    geom_line(arrow = arrow(length=unit(0.30,"cm"), ends="first", type = "closed")) 

Il grafico risultante è simile:

plot1

Ora ho cercato di "addensare" la frecce ...

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
    geom_point(size=5, aes(colour=YEAR)) + 
    geom_line(arrow = arrow(length=unit(0.30,"cm"), ends="first", type = "closed"), size = 3) 

Questo è il risultato mostrato qui:

plot2

La mia domanda: C'è un modo per tracciare alcune "belle" frecce di spessore?

+0

Modificare l'angolo e aumentare la lunghezza della freccia? –

+0

Provare a suonare con diversi argomenti: 'linetype' (può rendere la linea punteggiata di tratteggiata ecc.),' Freccia lunghezza', ecc. – rar

+0

Correlati: http://stackoverflow.com/questions/20658071/specifying-gpar-settings-for- grid-arrows-in-r - sfortunatamente la risposta è un po 'una caccia al tesoro (non so perché non ha pubblicato le funzioni completamente modificate). Inoltre, non so se si applica anche alle nuove versioni di ggplot. – lukeA

risposta

7

Io di solito uso geom_segment per creare la freccia. Ma per farlo dobbiamo modificare i dati dal formato "lungo" al formato "largo" (in genere utilizzando dcast dal pacchetto reshape2 o data.table). Ma questa volta ho provato a utilizzare la funzione base di reshape.

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
    geom_point(size=5, aes(colour=YEAR)) + 
    geom_segment(data = reshape(DATA, v.names="VALUE", idvar = "NAME", timevar = "YEAR", direction = "wide"), 
       aes(x=VALUE.2011, xend=VALUE.2016, y=NAME, yend=NAME), size = 2, 
       arrow = arrow(length = unit(0.5, "cm"))) 

arrow.segment

EDIT: ho trovato che stesso problema riguarda per tipo frecce "chiuse". Per ora, prova a salvare la trama come un grafico vettoriale (pdf o svg, usando ggsave o il menu Esporta nella scheda Plots). Il risultato non è "disordinato".

svg

+0

grazie - buon punto. tuttavia, questo funziona solo, quando si usano le frecce "aperte" - utilizzando "chiusi" risulta anche un casino ... 'ggplot (DATA, aes (x = VALORE, y = NOME)) + geom_point (dimensioni = 5, aes (color = YEAR)) + geom_segment (data = reshape (DATA, v.names = "VALUE", idvar = "NAME", timevar = "YEAR", direction = "wide"), aes (x = VALUE.2011, xend = VALUE.2016, y = NOME, yend = NOME), dimensione = 2, arrow = freccia (lunghezza = unità (0,5, "cm"), type = "chiuso")) ' –

+2

@Seba, da un pasticcio, vuoi dire che non ti piace la testa arrotondata della freccia? Se è così, dopo il plottaggio puoi fare 'grid.force(); grid.gedit ("segments", gp = gpar (linejoin = 'mitre')) '(da [qui] (http://stackoverflow.com/questions/29468437/look-of-arrows-in-ggplot2-geom-segment/ 29654023 # 29654023)) – user20650

+0

@ user20650: Con "un disastro" intendo che la punta della freccia (almeno quella chiusa) viene semplicemente incasinata (e perde la sua forma) se la dimensione è invocata nel 'geom_segment' (come pure in il blocco 'geom_line'). 'grid.gedit' non ha fatto nulla nel primo tentativo, ma potrebbe essere colpa mia. Oggi devo investire un po 'di tempo. –

3

Nell'ultimo (e intendo devtools::install_github("tidyverse/ggplot2") ultima, al momento di scrivere questa risposta - Sono sicuro che Mainline abbastanza presto) versione di ggplot2, c'è un argomento linejoin-geom_segment. L'utilizzo di linejoin='mitre' fornirà bordi nitidi. Vedi lo following for details.

+0

fantastico! Grazie, Carl! –

Problemi correlati