绘制大型邻接矩阵(不是图形)的最有效方法是什么?

What is the most efficient method to plot large Adjacency Matrices (not Graphs)?

我正在寻找一种在 R 中绘制大型邻接矩阵(>1M 节点)的有效方法。 目的不是将它们绘制为网络图,而是绘制邻接矩阵本身。

这是网络分析领域非常常见的可视化,尤其是社区检测,但我似乎无法找到在 R 中实现这种绘图的方法。我能找到的最接近的是函数 levelplot() 来自 lattice 但它似乎无法处理这种大小的矩阵。

下面是 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, size = 100L * 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, n), 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)

这需要一段时间,但最终证明是基于 lattice 中的 levelplot。输出是一个大的空白图。

想一想,如果你说一张 102 x 102 毫米的图片(~ 4 x 4 英寸)和一个 1m x 1m 的矩阵,那么矩阵的每个条目都有~ .0001 x .0001 毫米,如果我们忽略了轴等。对人类感知或图像了解不多,我猜你每英寸需要非常多的像素才能绘制这些,我不确定这是否会被感知,除非有更大的集群相邻的非零条目。

另一方面,如果你改变 n <- 10000L 那么你会得到:

相当快。上面还给出了感知小 1/100 x 1/100 的盒子有多难的指示。我猜人们必须在更大的邻域中寻找相邻非零节点的数量,但我不知道可以做到这一点的软件包。