R:如何有效地可视化大型图网络

R: How to Efficiently Visualize a Large Graph Network

我在 R 中模拟了一些图形网络数据(约 10,000 个观察值)并尝试使用 R 中的 visNetwork 库将其可视化。但是,数据非常混乱并且很难进行可视化分析(我理解实际生活中,网络数据是要使用图形查询语言进行分析的。

目前,我能做些什么来改善我创建的图网络的可视化(这样我就可以探索一些相互堆叠的联系和节点)?

是否可以使用 'networkD3' 和 'diagrammeR' 等库来更好地可视化该网络?

我在下面附上了我的可重现代码:

library(igraph)
library(dplyr)
library(visNetwork)

#create file from which to sample from
x5 <- sample(1:10000, 10000, replace=T)
#convert to data frame
x5 = as.data.frame(x5)

#create first file (take a random sample from the created file)
a = sample_n(x5, 9000)
#create second file (take a random sample from the created file)
b = sample_n(x5, 9000)

#combine
c = cbind(a,b)
#create dataframe
c = data.frame(c)
#rename column names
colnames(c) <- c("a","b")

graph <- graph.data.frame(c, directed=F)
graph <- simplify(graph)
graph

plot(graph)

library(visNetwork)
nodes <- data.frame(id = V(graph)$name, title = V(graph)$name)
nodes <- nodes[order(nodes$id, decreasing = F),]
edges <- get.data.frame(graph, what="edges")[1:2]

visNetwork(nodes, edges) %>%   visIgraphLayout(layout = "layout_with_fr") %>%
    visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE) %>% 
    visInteraction(navigationButtons = TRUE)

谢谢

应OP的要求,我正在应用上一个答案中使用的方法 这个问题。

问题中的网络不是使用指定的随机种子创建的。 在这里,我指定了可重复性的种子。

## reproducible version of OP's network
library(igraph)
library(dplyr)

set.seed(1234)
#create file from which to sample from
x5 <- sample(1:10000, 10000, replace=T)
#convert to data frame
x5 = as.data.frame(x5)

#create first file (take a random sample from the created file)
a = sample_n(x5, 9000)
#create second file (take a random sample from the created file)
b = sample_n(x5, 9000)

#combine
c = cbind(a,b)
#create dataframe
c = data.frame(c)
#rename column names
colnames(c) <- c("a","b")

graph <- graph.data.frame(c, directed=F)
graph <- simplify(graph)

正如 OP 所指出的,一个简单的情节就是一团糟。参考以前的答案 将其分为两部分:

  1. 绘制所有小组件
  2. 绘制巨型组件

1.小组件 不同的组件使用不同的颜色来帮助区分它们。

## Visualize the small components separately
SmallV = which(components(graph)$membership != 1)
SmallComp = induced_subgraph(graph, SmallV)
LO_SC = layout_components(SmallComp, layout=layout_with_graphopt)
plot(SmallComp, layout=LO_SC, vertex.size=9, vertex.label.cex=0.8, 
    vertex.color=rainbow(18, alpha=0.6)[components(graph)$membership[SmallV]])

可以用这个做更多的事情,但这相当简单,不是问题的实质,所以我将把它留作小组件的表示。

2。巨型组件
简单地绘制巨大的组件仍然很难阅读。这里有两个 改进显示的方法。两者都依赖于对顶点进行分组。 对于这个答案,我将使用 cluster_louvain 对节点进行分组,但是你 可以尝试其他社区检测方法。 cluster_louvain 产生 47 社区。

## Now try for the giant component
GiantV = which(components(graph)$membership == 1)
GiantComp = induced_subgraph(graph, GiantV)
GC_CL = cluster_louvain(GiantComp)
max(GC_CL$membership)
[1] 47

巨型方法1 - 分组顶点
创建强调社区的布局

GC_Grouped = GiantComp
E(GC_Grouped)$weight = 1
for(i in unique(membership(GC_CL))) {
    GroupV = which(membership(GC_CL) == i)
    GC_Grouped = add_edges(GC_Grouped, combn(GroupV, 2), attr=list(weight=6))
} 

set.seed(1234)
LO = layout_with_fr(GC_Grouped)
colors <- rainbow(max(membership(GC_CL)))
par(mar=c(0,0,0,0))
plot(GC_CL, GiantComp, layout=LO,
    vertex.size = 5, 
    vertex.color=colors[membership(GC_CL)], 
    vertex.label = NA, edge.width = 1)

这提供了一些见解,但是 许多 边缘让它有点难以阅读。

巨法2-契约社区
将每个社区绘制为单个顶点。顶点的大小 反映了该社区中的节点数。颜色代表 社区节点的度数。

## Contract the communities in the giant component
CL.Comm = simplify(contract(GiantComp, membership(GC_CL)))
D = unname(degree(CL.Comm))

set.seed(1234)
par(mar=c(0,0,0,0))
plot(CL.Comm, vertex.size=sqrt(sizes(GC_CL)),
    vertex.label=1:max(membership(GC_CL)), vertex.cex = 0.8,
    vertex.color=round((D-29)/4)+1)

这更干净,但失去了社区的任何内部结构。

只是给 'real-life' 的提示。处理大图的最佳方法是 1) 通过某种度量过滤您正在使用的边,或者 2) 使用一些相关变量作为权重。