我有一个相当大(但非常稀疏)的邻接矩阵(500x500),我试图直观地表示。在我看来,类似于力导向图的东西是我最好的选择,在尝试找出实现它的最佳方法时,我遇到了R的多个资源。最有帮助的是{{3上的网络可视化虽然我之前从未使用过R,但它似乎有很多有用的功能可用于这种可视化。
我设法在下面制作了一个图,但图像相当小,节点堆叠在一起。
http://kateto.net/network-visualization
如果我打印到pdf而不是PNG,分辨率稍好一些,但我仍然存在堆叠问题。因此,我的问题是,如何在R中正确绘制一个大的邻接矩阵来解决这些问题。
到目前为止我的代码如下(最后几行我尝试绘制数据的方式有几种不同)。任何提示都非常感谢。提前谢谢。
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中这样做感兴趣。
答案 0 :(得分: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()
最终结果仍然有些混乱,但是至少它避免了节点的过多重叠:
答案 1 :(得分:0)
尝试将绘图区域放大:
(max a . max b) c = max a (max b c)
答案 2 :(得分:0)
如果您的目标是坚持使用表示作为网络,则必须优化图形布局算法的布局参数,在您的情况下是Fruchterman-Reingold,为了获得漂亮的布局。
另一种解决方案是将另一种表示用作普通矩阵,请参阅“Adjacency matrix plots with R and ggplot2”。
最后但并非最不重要的一点是,您可以选择最大的组件并分别绘制一个组件。这就是我经常采取的方式。