2015-03-26 2 views
-1

I ont un ensemble de données de points XY qui ressemble à ceciRelier les points xy avec des lignes spatiales

x<-c(2,4,6,3,7,9,1) 
y<-c(6,4,8,2,9,6,1) 
id<-c("a","b","c","d","e","f","g") 
dataset<-data.frame(cbind(x,y,id)) 

Je voudrais relier toutes les combinaisons de tous les points avec des lignes spatiales, avec des lignes nommées avec des combinaisons de les points qu'ils se connectent

Dans « attributs de table » qui résulte de la sortie, les noms des lignes spatiales pourrait ressembler à ceci:

a_b 
a_c 
a_d 
a_e 
a_f 
a_g 
b_a 
b_c 
b_d 
b_e 
b_f 
b_g 
c_a 
etc. 
+0

'Combn (id, 2, FUN = function (x) pâte (x, effondrement = "_"))'? –

Répondre

1

Je spécule un peu ici sur ce que vous voulez exactement, mais je pense que vous voulez visualiser les connexions de n'importe quel point aux autres. Si c'est le cas, cela pourrait fonctionner. Mais d'abord, quelques hypothèses:

  • Vos coordonnées x et y sont des points de départ. Par conséquent, id sont donc id.origin
  • Tous les autres points devront devenir des "destinations", puis leurs propres coordonnées deviendront x_destination et ainsi de suite.

< disclaimer> Il devrait être une meilleure façon de faire plus élégant cela. J'apprécierais si quelqu'un plus expérimenté peut sauter et me montrer l'une des *ply façons de le faire. </disclaimer>

Répliquer la dataframe pour couvrir toutes les combinaisons possibles

dataset<-do.call(rbind, replicate(7, dataset, simplify=FALSE)) 

Maintenant, créez une matrice avec tous les mêmes points de destination, mixte:

nm=matrix(ncol=3) 
for (i in 1:7){ 
    nm<-rbind(nm,do.call(rbind,replicate(7,as.matrix(dataset[i,]),simplify=FALSE))) 
} 
nm<-nm[-1,] 

Renommer les colonnes de la matrice , donc ils ont un sens, et lier le cadre de données existant avec la nouvelle matrice

colnames(nm)<-c("x2","y2","id.dest") 
newds<-cbind(dataset,as.data.frame(nm)) 

Supprimer les trajectoires en double:

newds<-newds[-which(newds$id.origin==newds$id.dest),] 

et tracer le résultat en utilisant geom_segment:

p<-ggplot(newds,aes(x=x,y=y))+geom_segment(aes(xend=x2,yend=y2)) 

Il y a une façon de nommer les segments, mais l'observation de l'intrigue que je would't suggère de le faire. Au lieu de cela, vous pouvez envisager de nommer les points en utilisant geom_text (d'autres options sont disponibles, voir ?annotate pour un).

p<-p + geom_text(aes(x=1.8,y=6.1,label="a")) 

qui produira un terrain comme celui ici: Quiver-like plot of distances

+0

Bonnes choses @PavoDive - merci. Cela crée les lignes à coup sûr. Peut être combiné avec ce http://stackoverflow.com/questions/20531066/convert-begin-and-end-coordinates-into-spatial-lines-in-r pour faire les points en [lignes spatiales]. – Luke

1

La solution complète ressemble à ceci:

plot(dataset$x,dataset$y) 

Répliquer le dataframe pour couvrir toutes les combinaisons possibles

dataset<-do.call(rbind, replicate(7, dataset, simplify=FALSE)) 

Maintenant, créez une matrice avec al l les mêmes points de destination, mixtes:

nm=matrix(ncol=3) 
for (i in 1:7){ 
    nm<-rbind(nm,do.call(rbind,replicate(7,as.matrix(dataset[i,]),simplify=FALSE))) 
} 
nm<-nm[-1,] 

Renommez les colonnes de la matrice, de sorte qu'ils ont du sens, et de lier la trame de données existante par la nouvelle matrice

colnames(nm)<-c("x2","y2","id.dest") 
newds<-cbind(dataset,as.data.frame(nm)) 

Supprimer trajectoires dupliqués:

newds1<-newds[-which(newds$id==newds$id.dest),] 

library(ggplot2) 

Conversion destination x & y à numérique du facteur

newds1$x2<-as.numeric(as.character(newds1$x2)) #converting from factor to numeric 
newds1$y2<-as.numeric(as.character(newds1$y2)) 

Tracé des points de destination. . .même comme les points d'origine

plot(newds1$x, newds1$y) 
plot(newds1$x2, newds1$y2, col="red") 

Maintenant, utilisez le code de cette réponse:

Convert Begin and End Coordinates into Spatial Lines in R

liste brute pour stocker des objets Lines:

l <- vector("list", nrow(newds1)) # 

Ce l est maintenant vecteur vide w/nombre de lignes défini par la longueur (nrow) de newds1

origine Fractionnement et coordonnées de destination que je peux exécuter ce script:

origins<-data.frame(cbind(newds1$x, newds1$y)) 
destinations<-data.frame(cbind(newds1$x2, newds1$y2)) 

library(sp) 
for (i in seq_along(l)) { 
    l[[i]] <- Lines(list(Line(rbind(origins[i, ], destinations[i,]))), as.character(i)) 
} 

l.spatial<-SpatialLines(l) 
plot(l.spatial, add=T)