#r #igraph
#r #igraph
Вопрос:
Я хотел бы видеть размер узла / вершины, основанный на количестве соединенных ребер. Например, если узел 1 имеет большее количество соединенных ребер с другими узлами, то размер узла 1 должен быть больше. Я взял гипотетические простые данные и попытался построить сетевой график, который работает довольно хорошо. По сути, сетевой график представляет собой сеть соавторства. Тем не менее, я хотел бы настроить размер узла в зависимости от количества соединенных ребер. Кроме того, я хотел бы знать, как я могу настроить цвет ребер?. Например, если узел 1 имеет более 4 соединений, то цвет всех этих 4 ребер должен быть красным.
Ниже приведен код, который работает хорошо:
library(igraph)
# original data as a list
input_data = list(c(1,2,3),c(1,4,5),c(1,6),c(3),c(4,6))
## function that makes all pairs
pairing <- function(x) {
n = length(x)
if (n<2) {
res <- NULL
} else {
q <- combn(n,2)
x2 <- x[q]
#dim(x2) <- dim(q)
res <- x2
}
return(res)
}
## for each paper create all author pairs
pairing_bypaper = lapply(input_data,pairing)
## remove papers that contribute no edges
pair_noedge = sapply(pairing_bypaper,is.null)
pair2_bypaper <- pairing_bypaper[!pair_noedge]
## combine all 'subgraphs'
pair_all <- do.call('c',pair2_bypaper)
## how many authors are there?
n.authors <- length(unique(pair_all))
## make a graph
my_graph = graph(pair_all, directed = FALSE)
## plot
plot(my_graph)
plot(my_graph, vertex.label.cex = 0.8, edge.width = E(my_graph)$weight)
Большое спасибо в advanced.
Ответ №1:
Сначала определите степень вашего графика — показатель того, сколько точек подключено к каждой вершине:
degree(my_graph)
[1] 5 2 2 3 2 2
Затем мы можем использовать это как размер вершины:
## size
V(my_graph)$vertex_degree <- degree(my_graph)
И затем в вашем вызове plot:
plot(my_graph,
vertex.label.cex = 0.8,
edge.width = E(my_graph)$weight,
vertex.size = V(my_graph)$vertex_degree #add this
)
Если вы хотите увеличить или уменьшить масштаб, вы могли бы заменить приведенную выше строку чем-то вроде:
scale_factor <- 4
plot(my_graph,
vertex.label.cex = 0.8,
edge.width = E(my_graph)$weight,
vertex.size = V(my_graph)$vertex_degree * scale_factor
)
Комментарии:
1. Можно также поместить
degree()
вызов прямо вplot()
вызов и масштабировать по своему усмотрению:plot(my_graph, vertex.size=degree(my_graph)); plot(my_graph, vertex.size=degree(my_graph)*3); plot(my_graph, vertex.size=degree(my_graph)^2)
2. возвращаемый объект из вызова degree — это просто вектор, поэтому вы можете масштабировать его так, как вам нравится (
^
,log()
, …)