【问题标题】:Properly plotting large adjacency matrix in R在 R 中正确绘制大型邻接矩阵
【发布时间】:2017-05-04 06:04:51
【问题描述】:

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

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

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

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

为方便起见,我已将引用到我的 GitHub 的两个文件上传到这里 https://github.com/BStricklin/DataViz

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 中执行此操作感兴趣。

【问题讨论】:

  • 看看矩阵与图表的对比图会很有趣en.wikipedia.org/wiki/Adjacency_matrix
  • 你是对的@user20650,链接是kateto.net/network-visualization
  • @Zboson 如果你去我的 github 页面,可以说文件 nodeAdjacency.csv 就是图表。不同之处在于矩阵是加权的,而不是像您链接到的页面上那样简单地填充框,矩阵的数字代表连接的强度。
  • 一种选择是使用statnet 包并在gplot 函数中设置displayisolates = FALSE。如果你坚持使用igraph,你可以设置一个阈值来绘制大于常数的边。
  • 我会考虑使用例如networkD3 制作交互式图表。这些通常比导出有用信息的静态图更有用

标签: r igraph adjacency-matrix adjacency-list-model


【解决方案1】:

您可以从简化网络可视化开始的一件事是删除未连接的顶点 - 度数低于 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()

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

Network plotted using igraph::layout_with_graphopt

【讨论】:

    【解决方案2】:

    尝试将绘图区域扩大:

    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()
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多