Пытаясь воссоздать сеть, как назначить вес ребер конкретным ребрам? - PullRequest
0 голосов
/ 30 сентября 2019

Итак, передо мной была поставлена ​​задача воссоздать определенную сеть, как показано здесь: enter image description here

Хотя мне удалось выяснить, как поиграться с узлами, яне знаете, как назначить каждое ребро ширине. Я предполагаю, что это должно быть сделано аналогично цвету / форме узла, который хранится как вектор. Тем не менее, как я точно знаю, что это за край?

library(sna)

hw2 <- rbind(
  # 1 2 3 4 5 6 7 8 932 1 2 3 4 8 0 2
  c(0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
  c(1,0,1,1,0,0,0,1,0,0,0,0,0,1,1,1,1),
  c(1,1,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0),
  c(1,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0),
  c(1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0),
  c(1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0),
  c(1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0),
  c(1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0),
  c(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
  c(1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
  )

#Labels
rownames(hw2) <- c("a1","a2","a3","a4","a5","a6","a7","a8","a9","a32","a11","a12","a13","a14","a18","a20","a22")
colnames(hw2) <- c("a1","a2","a3","a4","a5","a6","a7","a8","a9","a32","a11","a12","a13","a14","a18","a20","a22")

#Colors
net_col <-  c(rep("steelblue",8),rep("lightcoral",2),rep("steelblue",8))
edge_col <- c(rep("blue4",) )
#Shape
net_size <-c(rep(4,8),rep(50,2),rep(4,8))

#Network
net_hw2 <- network(hw2,matrix.type="adjacency")

#Graph 1 , similar to existing graph
gplot(net_hw2,vertex.col = net_col,usearrows = F,displaylabels = T,label.pos = 5,
      vertex.cex = 3, vertex.sides = net_size)

1 Ответ

1 голос
/ 30 сентября 2019

Вы можете назначить ширину краям, используя аргумент edge.lwd для gplot. Чтобы соответствовать вашему целевому графику, я также назначу цвет с помощью edge.col. Единственная сложность - выяснить, какой край какой. Я просто установлю ширину и цвет края для one edge. После этого я позволю вам настроить все остальные.

Вы можете получить все ребра, используя as.edgelist(net_hw2) Это дает ребра на основе числа узлов. Вы можете сопоставить номер узла его имени, используя ваш список rownames(hw2). Я буду использовать в качестве примера грань между а3 и а9. Этот край толще, чем большинство других, и желтый, а не синий. Глядя на rownames(hw2), мы видим, что a3 - это узел 3, а a9 - это узел 9. Просматривая выходные данные as.edgelist(net_hw2), мы видим, что ребра 29 и 51 соединяют эти узлы.

Я сделаю вектор цветови ширины, так что цвет по умолчанию - темно-синий, а ширина по умолчанию - 1.

LWD = rep(1, nrow(as.edgelist(net_hw2)))
COL = rep("navy", nrow(as.edgelist(net_hw2)))

Теперь мы можем явно изменить цвет и ширину для ребер, соединяющих a3 и a9

LWD[29] = 8
COL[29] = "yellow"
LWD[51] = 8
COL[51] = "yellow"

Теперь вы можете просто использовать это на графике

gplot(net_hw2,vertex.col = net_col,usearrows = F, displaylabels = T,
    label.pos = 5, vertex.cex = 3, vertex.sides = net_size, 
    edge.col=COL, edge.lwd=LWD)

graph with adjusted edge color and width

Теперь у нас есть хороший широкий желтый край между a3 и a9. Вы можете изменить цвет и ширину любых других краев таким же образом.

...