10

我有一个相当大(但非常稀疏)的邻接矩阵(500x500),我试图在视觉上表示。在我看来,类似于力有向图的东西是我最好的选择,在试图找出实现这一点的最佳方法时,我遇到了不止一个 R 资源。最有帮助的是http:/上的网络可视化/kateto.net/network-visualization虽然我以前从未使用过 R,但它似乎为这种可视化提供了许多有用的功能。

我设法在下面生成了一个图,但图像相当小并且节点是堆叠的。

在此处输入图像描述

如果我打印到 pdf 而不是 PNG,分辨率会稍微好一些,但我仍然有堆叠问题。因此,我的问题是,我将如何在 R 中正确绘制一个大的邻接矩阵来解决这些问题。

到目前为止,我的代码如下(最后几行我尝试了几种不同的方式来绘制我的数据)。非常感谢任何提示。先感谢您。

为方便起见,我在https://github.com/BStricklin/DataViz上传了引用到我的 GitHub 的两个文件。

plot.new()
library('igraph')
setwd("D:/Downloads/polnet2016/Data files")

nodes2 <- read.csv("nodes.csv", header=T, as.is=T)
links2 <- read.csv("nodeAdjacency.csv", header=T, row.names=1)

links2 <- as.matrix(links2)

head(nodes2)
head(links2)

net2 <- graph_from_incidence_matrix(links2)
net2 <- graph_from_adjacency_matrix(links2, mode = "undirected", weighted = TRUE)
net2 <- simplify(net2, remove.multiple = F, remove.loops = T) 

V(net2)$label <- nodes2$id

deg <- degree(net2, mode="all")
V(net2)$size <- deg*3

#plot(net2)
#plot(net2, edge.label=round(E(net2)$weight, 3))
layout <- layout.reingold.tilford(net2)
#plot.igraph(net2,vertex.size=3,layout=layout.lgl)
plot.igraph(net2,vertex.size=3,vertex.label.cex=.5,layout=layout.fruchterman.reingold(net2, niter=10000))

编辑:对于任何想知道我最终是如何做到这一点的人,我必须使用 MATLAB 并使用图形和绘图函数。它看起来和 R 图像一样糟糕,但是通过对节点的一些自定义和缩放功能的使用,它运行得很好。不过,我仍然会对如何在 R 中做到这一点感兴趣。

4

3 回答 3

2

您可以开始简化网络可视化的一件事是删除未连接的顶点 - 度数低于 1 的顶点:

net3 <- delete.vertices(net2, degree(net2)<1)

然后,您可以使用更适合大型网络的布局算法,例如 ,这是layout_with_graphopt一种力导向算法,它允许设置“弹簧”的初始长度,该长度产生最终将导致最终布局的力:

net.graphopt <- layout_with_graphopt(net3, charge = 0.009, mass = 50, spring.length = E(net3)$weight) 

最终,您可以在更大的绘图区域中绘制网络(如上面第一个答案中所建议的那样)增加pdf()命令的高度和宽度,如下所示:

pdf("graphopt.pdf", height = 14, width = 14)
plot.igraph(net3,vertex.size=2,vertex.label.cex=.5,layout=net.graphopt)
dev.off()

最终的结果还是有点乱,但至少避免了过多的节点重叠:

网络绘制使用igraph::layout_with_graphopt

于 2020-01-12T17:18:55.547 回答
0

如果您打算坚持将表示作为网络,则必须优化图形布局算法的布局参数,在您的情况下是Fruchterman-Reingold的布局参数,以获得漂亮的布局。

另一种解决方案是使用另一种表示作为普通矩阵,请参阅“ Adjacency matrix plots with R and ggplot2 ”。

最后但并非最不重要的一点是,您可能会挑选出最大的组件并单独绘制该组件。这就是我通常采取的方式。

于 2017-08-16T13:13:54.590 回答
0

尝试使绘图区域更大:

png("network_name.png", width = 15, height = 15, units = "in", res = 300)
plot.igraph(net2,vertex.size=3, 
vertex.label.cex=.5, 
layout=layout.fruchterman.reingold(net2, niter=10000)) 
dev.off()
于 2016-12-23T06:45:34.533 回答