2016-03-15 19 views
5

Ich habe folgenden Datenrahmen:Zeichnen von Linien zwischen allen Koordinaten in einem Grundstück

data <- data.frame(x = c(5,1,3,2,5,7,12), y = c(5,7,6,1,3,5,6)) 

ich diese Koordinaten mit der ggplot Funktion zeichnen kann und eine Linie zwischen diesen Koordinaten zeichnen:

ggplot(data, aes(x, y)) + geom_point(size = 3) + geom_line() 

So weit, keine Probleme. Aber statt einer einzigen Linie durch die Koordinaten möchte ich, dass zwischen allen Koordinaten eine Linie gezeichnet wird. Erstellen einer Art Spinnennetz zwischen allen Koordinaten. Ist das im ggplot2 Paket möglich?

+1

„Ich möchte, dass eine Linie zwischen allen Koordinaten gezogen wird,“ bedeutet das, dass Sie jeden einzelnen Punkt zu jedem anderen Punkt verbunden werden möchten? Nicht sicher, ob ggplot es hat, aber einige Graph Plotten Paket könnte hier besser sein – Marsenau

+0

Ja, jeder einzelne Punkt muss mit jedem anderen Punkt verbunden werden – Jelmer

+1

versuchen Sie das 'igraph' Paket und machen Sie einen vollständigen Graphen, dann zuweisen Vertex Koordinaten auf der Grundlage Ihrer Datenrahmen –

Antwort

13

Wenn Sie dies in ggplot2 tun möchten, können Sie dafür geom_segment verwenden. Bevor Sie jedoch einen solchen Plot erstellen können, müssen Sie einen Datenrahmen erstellen, der jede Beobachtung mit den anderen Beobachtungen verbindet. Man könnte es Ansatz wie folgt:

library(ggplot2) 
library(dplyr) 
library(tidyr) 
dat %>% 
    complete(nesting(x,y), id) %>%  # create the combinations 
    select(id, xend=x, yend=y) %>%  # rename the new variables as end-points 
    left_join(dat, ., by = 'id') %>%  # join with the original dataframe 
    filter(!(x==xend & y==yend)) %>%  # remove the endpoints that are the same as the start points 
    ggplot(., aes(x, y)) + 
    geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + 
    geom_label(aes(x = x, y = y, label = id, color = factor(id)), show.legend = FALSE) + 
    theme_minimal(base_size = 14) + 
    theme(axis.title = element_blank()) 

die gibt:

enter image description here


Gebrauchte Daten:

dat <- data.frame(x = c(5,1,3,2,5,7,12), y = c(5,7,6,1,3,5,6)) 
dat$id <- 1:nrow(dat) 

Alternativ können Sie auch die Zeile hinzufügen -im Vorbeigehen ohne tut es vorher:

dat %>% 
    mutate(id = row_number()) %>%  # add a row id 
    complete(nesting(x,y), id) %>%  # create the combinations 
    select(id, xend=x, yend=y) %>%  # rename the new variables as end-points 
    left_join(dat %>% mutate(id = row_number()), ., 
      by = 'id') %>%    # join with the original dataframe (also with an added row id) 
    filter(!(x==xend & y==yend)) %>%  # remove the endpoints that are the same as the start points 
    ggplot(., aes(x, y)) + 
    geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + 
    geom_label(aes(x = x, y = y, label = id, color = factor(id)), show.legend = FALSE) + 
    theme_minimal(base_size = 14) + 
    theme(axis.title = element_blank()) 
+1

noch schicker :) Ich kann nicht geben out +1 wieder yanno: p – MichaelChirico

+0

@MichaelChirico Ich habe das gleiche Problem ;-) – Jaap

14

Mit base Plotten:

plot(data) 
sapply(combn(nrow(data), 2, simplify = FALSE), 
     function(x) do.call("segments", as.list(c(t(data[x,]))))) 

enter image description here

hinzufügen Schnickschnack zu probieren.

Sie können auch das FUN Argument in combn verwenden:

plot(data) 
combn(nrow(data), 2, simplify = FALSE, FUN = function(cm){ 
    segments(x0 = data[cm[1], 1], 
      y0 = data[cm[1], 2], 
      x1 = data[cm[2], 1], 
      y1 = data[cm[2], 2]) 
}) 
+3

@MichaelChirico Ich habe mir die Freiheit genommen, eine 'All 'Combn''Alternative hinzuzufügen. Hoffe, es macht Ihnen nichts aus. Setzen Sie die Bearbeitung einfach zurück, wenn Sie sie redundant finden. – Henrik

Verwandte Themen