2016-03-15 13 views
5

Mam następujący dataframe:Narysuj linie między wszystkich współrzędnych w działce

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

mogę wykreślić te współrzędne z funkcją ggplot i narysować linię pomiędzy tymi współrzędnymi:

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

Tak daleko, żadnych problemów. Ale zamiast jednej linii za pomocą współrzędnych, chcę, aby została narysowana linia między wszystkimi współrzędnymi. Tworzenie rodzaju pajęczyny między wszystkimi współrzędnymi. Czy jest to możliwe w pakiecie ggplot2?

+1

„Chcę, że linia jest rysowana między wszystkich współrzędnych” to znaczy, że chcesz każdy punkt należy podłączyć do każdego innego punktu? Nie jestem pewien, czy ma go ggplot, ale może być tutaj lepszy pakiet do rysowania wykresów. – Marsenau

+0

Tak, każdy pojedynczy punkt musi być połączony z każdym innym punktem – Jelmer

+1

wypróbuj pakiet 'igraph' i utwórz kompletny wykres, a następnie przypisz wierzchołek współrzędne w oparciu o ramkę danych –

Odpowiedz

13

Jeśli chcesz to zrobić w ggplot2, możesz użyć do tego geom_segment. Zanim jednak będziesz mógł wykonać taki wykres, musisz stworzyć ramkę danych, która łączy każdą obserwację z innymi obserwacjami. Można go zbliżyć się następująco:

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()) 

co daje:

enter image description here


Używane dane:

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) 

Alternatywnie, można również dodać wiersz - w locie bez robi to wcześniej:

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

jeszcze bardziej zaawansowany :) Nie mogę podać out +1 znowu yanno: p – MichaelChirico

+0

@MichaelChirico Mam ten sam problem ;-) – Jaap

14

Korzystanie base wydrukiem:

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

enter image description here

Dodaj wodotryski do smaku.

Można również użyć FUN argument combn:

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 Pozwoliłem sobie na dodanie alternatywy "all' combn'". Mam nadzieję, że nie masz nic przeciwko. Po prostu cofnij edycję, jeśli uznasz ją za zbyteczną. – Henrik

Powiązane problemy