Рисование графа 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
магия. Чтобы проиллюстрировать его мощь, я смешал и сопоставил различные ребра и узлы geom
s обеспечить выборку того, что возможно с 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)
В качестве альтернативы, если вы хотите использовать метод 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 )