R visNetwork + igraph 加权网络可视化与 visEdges
R visNetwork + igraph weighted network visualization with visEdges
我有一个关于将 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)$weigth.
不同的边宽
你能告诉我怎么做吗?
使用 visNodes
和 visEdges
您可以为所有节点和边设置 全局选项 。例如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")
这会产生下图:
请告诉我这是否是您想要的。
我有一个关于将 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)$weigth.
不同的边宽你能告诉我怎么做吗?
使用 visNodes
和 visEdges
您可以为所有节点和边设置 全局选项 。例如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")
这会产生下图:
请告诉我这是否是您想要的。