Вы можете раскрасить вершины и ребра в 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()
для хорошего примера.