R visNetwork + igraph加权网络可视化与visEdges

11

关于将igraph与visNetwork结合使用,我有一个非常简单的问题。我想用visEdges(value=E(graph)$weight)给边加权,但这并不起作用。 这里是一个玩具示例,以说明这个问题:

     test
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    3    7    1
[2,]    4    0    8    9    5
[3,]   10    3    0    8    3
[4,]    5    1    5    0    7
[5,]    8    2    7    4    0

library(igraph); library(visNetwork)

test.gr <- graph_from_adjacency_matrix(test, mode="undirected", weighted=T)

如果我现在尝试将其可视化为加权图,它不会绘制出来:
test.gr %>%
  visIgraph(layout = "layout_in_circle") %>%
  visEdges(value = E(test.gr)$weight)

如果我使用

test.gr %>%
  visIgraph(layout = "layout_in_circle") %>%
  visEdges(value = 10)

相反,我得到了一个图:

在此输入图片描述

但这当然不是我想要的。我希望根据E(test.gr)$weight获得不同的边缘宽度。

您能告诉我如何做到这一点吗?

1个回答

15
使用visNodesvisEdges,您可以为所有节点和边设置全局选项。例如,使用visNodes(shape = "square"),您可以将所有节点设置为正方形。但是要注意,这不是设置单个边缘宽度的正确方法。
要实现您想要的效果,您可以将igraph对象转换为visNetwork列表。然后,您可以添加一个名为"value"的"expected"列。visNetwork将使用该列为边缘赋权。
也许这不是最好的解决方案,但它确实可行。
test <- as.matrix(read.table(header = FALSE, text = "
    0    1    3    7    1
    4    0    8    9    5
   10    3    0    8    3
    5    1    5    0    7
    8    2    7    4    0"))

library(igraph)
library(visNetwork)

## make igraph object
test.gr <- graph_from_adjacency_matrix(test, mode="undirected", weighted=T)

## convert to VisNetwork-list
test.visn <- toVisNetworkData(test.gr)
## copy column "weight" to new column "value" in list "edges"
test.visn$edges$value <- test.visn$edges$weight

test.visn$edges
# from to weight value
#   V1 V2      4     4
#   V1 V3     10    10
#   V1 V4      7     7
#   V1 V5      8     8
#   V2 V3      8     8
#   V2 V4      9     9
#   V2 V5      5     5
#   V3 V4      8     8
#   V3 V5      7     7
#   V4 V5      7     7

visNetwork(test.visn$nodes, test.visn$edges) %>%
  visIgraphLayout(layout = "layout_in_circle") 

这将产生如下图表:

enter image description here

请告诉我这是否是您想要的内容。

你救了我的命,这正是我在寻找的。毫无疑问,visNetwork应该实现这个功能。顺便说一下,边缘差异太大了,我们该如何避免呢? - Alber8295

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接