2015-12-17 8 views
5

Ho un frame di dati assomiglia a questo:R: tracciare una linea tra due punti in ggplot

X  Y 
100 50 
80  60 
70  90 
110 60 
30  20 
... ... 

circa 100 linee di più. Sia la colonna X e Y colonna sono numerici

Quando tracciare questi punti, desidero tracciare una linea tra primo punto (100,50) e uno qualsiasi dei punti di appoggio. In altre parole, mi piacerebbe avere una linea collega (100,50) con (80,60), una linea collega (100,50) con (70,90), una linea di collegamento (100,50) con (110 , 60), ma non v'è alcuna linea tra (80,60) e (70,90). Tutte le linee iniziano dal primo punto.

Non ho la terza colonna. Non posso usare il gruppo. Mi chiedo se posso ancora tracciare questo grafico nel ggplot.

Grazie

risposta

8

L'idea è di utilizzare gruppo. Per questo, devi aggiungere una terza colonna che può essere utilizzata per il raggruppamento. Un modo possibile per raggiungere questo è il seguente.

primo luogo, definire i dati campione

df <- read.table(text = "X  Y 
     100 50 
     80  60 
     70  90 
     110 60 
     30  20", header = TRUE) 

Poi, crea un nuovo frame di dati, in cui la prima riga viene ripetuta per ciascuna delle altre righe. Una colonna grp si aggiunge, che collega ciascuna delle ripetizioni della prima fila ad una delle altre righe:

n <- nrow(df) - 1 
new_data <- data.frame(X = c(rep(df$X[1], n), df$X[-1]), 
         Y = c(rep(df$Y[1], n), df$Y[-1])) 
new_data$grp <- as.factor(rep(1:n, times = 2)) 
new_data 
##  X Y grp 
## 1 100 50 1 
## 2 100 50 2 
## 3 100 50 3 
## 4 100 50 4 
## 5 80 60 1 
## 6 70 90 2 
## 7 110 60 3 
## 8 30 20 4 

Ora, la trama può essere creato direttamente con ggplot:

library(ggplot2) 
ggplot(new_data, aes(X, Y, group = grp)) + 
    geom_point() + geom_line() 

enter image description here

Le estetiche group controlla quali punti devono essere collegati da una linea. Poiché la colonna grp in coppie new_data sempre una ripetizione della prima riga con ciascuna delle altre righe, il punto corrispondente alla prima riga è collegato a ciascuno degli altri punti.

Se si omette group = grp, viene tracciato un grafico con una singola linea che attraversa tutti i punti.

+0

grande risposta con i dettagli. Molto facile da capire. Grazie! – cutebunny

+1

Solo un componente aggiuntivo, si può usare 'aes (X, Y, group = 1)' per connettere tutti i punti, senza generare una nuova colonna. –