问题描述
我正在寻找一种在R中绘制大型邻接矩阵(> 1M节点)的有效方法。 目的不是将它们绘制为网络图,而是绘制邻接矩阵本身。
这是网络分析尤其是社区检测领域中非常常见的可视化,但是我似乎找不到在R中实现这种绘图的方法。我能找到的最接近的函数是{{1} },但似乎无法处理这种大小的矩阵。
下面是Reichardt & Bornholdt的论文中期望结果的示例。
邻接矩阵可以从Stanford Large Network Dataset Collection下载。
解决方法
我的第一个赌注是看Matrix包中的image
方法。一个例子可能是这样的:
#####
# simulate a random matrix
n <- 1000000L # number of nodes
set.seed(1)
rng_i <- sample.int(n,size = 100L * n,replace = TRUE)
rng_j <- sample.int(n,replace = TRUE)
i <- c(1:n,rng_i,rng_j)
j <- c(1:n,rng_j,rng_i)
x <- runif(n * 100L)
x <- c(rep(1,n),x,x)
keep <- j <= i & c(rep(TRUE,tail(i,-n) != tail(j,-n))
j <- j[keep]
i <- i[keep]
x <- x[keep]
# use the image method from Matrix
library(Matrix)
mat <- sparseMatrix(i = i,j = j,x = x,symmetric = TRUE)
image(mat)
这需要一段时间,但结果是基于levelplot
中的lattice
。输出是一个大的空白图。
仔细考虑一下,如果您说一张102 x 102毫米的图片(〜4 x 4英寸)和一个1m x 1m的矩阵,那么如果我们忽略该矩阵,则每个矩阵条目都有〜.0001 x .0001 mm轴等。我对人类的感知或图像了解不多,我想您需要每英寸大量的像素才能绘制这些像素,并且我不确定这是否可以感知,除非附近有更大的群集非零条目。
另一方面,如果您更改n <- 10000L
,则会得到:
相当快。上面的内容还说明了感知1/100 x 1/100较小的盒子有多困难。我猜想人们将不得不寻找更大邻域中相邻非零节点的数量,但我不知道有一个可以做到这一点的软件包。