Как раскрасить вершины и выделить ссылки в графике - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в igraph и пытаюсь построить небольшие сети, в которых я раскрашиваю вершины на основе атрибута и выделяю указанные c ссылки.

Скажем, у меня есть матрица смежности (adj_matrix) для сети (myNet) с 8 вершинами:

> adj_matrix
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    0    0    0    0    0    1
[2,]    1    0    1    0    0    0    0    0
[3,]    0    1    0    1    0    0    0    0
[4,]    0    0    1    0    0    0    0    1
[5,]    0    0    0    0    0    1    0    0
[6,]    0    0    0    0    1    0    1    0
[7,]    0    0    0    0    0    1    0    1
[8,]    1    0    0    1    0    0    1    0 

И в отдельном кадре данных (df) я иметь 8 соответствующих значений:

> df
  name    values
1    1 0.3568838
2    2 0.5260344
3    3 0.3568838
4    4 0.7374865
5    5 0.7140553
6    6 0.5260344
7    7 0.4125705
8    8 0.7374865

В качестве временного решения я могу построить это как неориентированную сеть с вершинами, окрашенными nodes$values вручную, так:

as_edgelist(myNet, names = TRUE)

links <- data.frame(
  source=as_edgelist(myNet, names = TRUE)[,1],
  target=as_edgelist(myNet, names = TRUE)[,2])

palf <- colorRampPalette(c("gray80", "red"))
network <- graph_from_data_frame(d = links, vertices = df, directed = F)
plot(network, vertex.color = palf(8), layout=layout_in_circle)

Но это очевидно утомительно, и должен быть лучший способ. В идеале был бы способ использовать только матрицу смежности для построения ребер и вектор значений для окрашивания вершин. Как я могу это сделать?

Кроме того, я хотел бы знать, как выделить (т.е. выделить жирным шрифтом, изменить цвет и / или изменить тип линии) заданного края.

1 Ответ

0 голосов
/ 18 февраля 2020

Вы можете раскрасить вершины и ребра в igraph, указав значения vertex.color и edge.color, когда вы plot().

Пока все хорошо в вашем примере, но вы действительно должны попробовать работать с igraph-объектами вместо ваших временных решений. Подумайте о том, чтобы сделать ваш граф с graph_from_edgelist() или graph_from_adjacency_matrix().

. Объект igraph естественно строит атрибуты verticy, такие как color, и атрибуты ребер, такие как color и width. Вы можете установить их, установив их так:

V(network)$color <- "white"
V(network)$color <- "black"

Обратите также внимание, что ваш код выше не окрашивает края в соответствии с вашими значениями в df, а представляет собой линейный градиент от серого до красного сгенерированный вашим palf():)

Этот код копирует данные вашего примера

df <- data.frame(name=1:8, values=c(0.3568838,0.5260344, 0.3568838,0.7374865,0.7140553,0.5260344,0.4125705,0.7374865))
g <- make_empty_graph(n=8, directed=F) %>% add_edges(c(1,2,2,3,3,4,4,8,1,8,8,7,7,6,6,5))
adj_matrix <- as.matrix(as_adjacency_matrix(g))

Так вы можете начать раскрашивать и выделять

# Make network and assign values from dataframe
network <- graph_from_adjacency_matrix(adj_matrix, mode="undirected")
V(network)$value <- df$values
V(network)$col_values <- round( V(network)$value, 2) * 100

# Colour vertecies
colours <- colorRampPalette(c("gray80", "red"))(100)
V(network)$color <- colours[ V(network)$col_values ]

# Color edges
E(network)$color <- "black"

#Highlight edge
E(network)$width <- 1
E(network)$width[5] <- 5

# Plot
plot(network, layout=layout_in_circle)

Очень простой способ, если ваши фреймы данных в порядке, - это напрямую назначать атрибуты ребрам и вершинам при создании сети с использованием graph_from_data_frame(). Просто убедитесь, что во фреймах данных для вершин и ребер актуарно есть столбцы с именами color или width или любые другие значения, которые вы хотите установить, и соответствующие значения для этих атрибутов.

См. Руководство ?graph_from_data_frame() для хорошего примера.

...