Сетевой график с использованием R: размер узла, основанный на количестве соединенных ребер

#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() , …)