Рисование графа G=(V,E) в R

Я хотел бы нарисовать стандартный граф G=(V,E) в R с помощью ggplot или некоторых встроенных функций R.

У меня есть фрейм данных, содержащий координаты вершин:

> V
      x        y
1  589.3438 6422.883
2 8762.6921 7789.147
3 7973.0883 4552.745
4 4100.8408 8108.702
5 6049.3329 6547.239

и симметричная матрица с нулем один, представляющая ребра:

> E
       [,1] [,2] [,3] [,4] [,5]
 [1,]    0    0    0    1    0
 [2,]    0    0    1    0    1
 [3,]    0    1    0    0    1
 [4,]    1    0    0    0    1
 [5,]    0    1    1    1    0

Я строю вершины, используя:

plotGraph <- function() {
  qplot(x,
        y,
        data=V,
        xlim=c(0,SIZE),
        ylim=c(0,SIZE),
        main="Graph"
  )
}

Как я мог нарисовать края графика на одном графике? Или как мне построить одно ребро от (x1, y1) до (x2, y2)?

Любая помощь будет оценена.

1 ответ

Решение

РЕДАКТИРОВАТЬ (7 июля 2017 г.):

Так как я ответил на вопрос первоначально, новый и улучшенный пакет построения графиков сети / графика, ggraph, был опубликован, и я думаю, что он должен заменить параметры ниже, поэтому я редактирую свой ответ, чтобы добавить ggraph опция:

Сначала немного манипулируем, чтобы получить вершины и ребра как объект графа igraph:

library(igraph)
library(tidyverse)
library(ggraph)

V <- read.table(text = "x        y
                        589.3438 6422.883
                        8762.6921 7789.147
                        7973.0883 4552.745
                        4100.8408 8108.702
                        6049.3329 6547.239", 
    header = T) %>%
  rownames_to_column("name")

E <- matrix(c(0,    0,    0,    1,    0,
              0,    0,    1,    0,    1,
              0,    1,    0,    0,    1,
              1,    0,    0,    0,    1,
              0,    1,    1,    1,    0), nrow = 5, byrow = T) %>%
  data.frame() %>% 
  rename_all(list(function(x) 1:5)) %>% 
  rownames_to_column(var = "from") %>% 
  gather(to, val, 2:6) %>% 
  filter(val == 1) %>%
  select(from, to)

g <- graph_from_data_frame(E, vertices = V, directed = F)

теперь приходит ggraph магия. Чтобы проиллюстрировать его мощь, я смешал и сопоставил различные ребра и узлы geoms обеспечить выборку того, что возможно с ggraph,

ggraph(g) + 
  geom_edge_link() + 
  geom_node_label(aes(label = name))
#> Using `nicely` as default layout

ggraph(g) + 
  geom_edge_arc() + 
  geom_node_point()
#> Using `nicely` as default layout

ggraph(g) + 
  geom_edge_diagonal() + 
  geom_node_text(aes(label = name), color = "blue")
#> Using `nicely` as default layout


Оригинальный ответ:

При использовании igraph это вариант, я бы порекомендовал его. Это очень полезный пакет при работе с графиками. Вот как я мог бы сделать это с помощью igraph:

library(igraph)

# convert V to a matrix and E to a graph
V <- data.matrix(V)
g <- graph_from_adjacency_matrix(E, mode="undirected")

plot.igraph(g, layout = V)

вывод igraph

В качестве альтернативы, если вы хотите использовать метод ggplot, вы можете использовать ggnet2 от GGally пакет:

library(GGally)

V <- data.matrix(V)
# with ggnet2 you don't have to convert E to a graph

ggnet2(net = E, mode = V ) 

выход ggnet2

Другие вопросы по тегам