绘制大型邻接矩阵(不是图形)的最有效方法是什么?
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 的盒子有多难的指示。我猜人们必须在更大的邻域中寻找相邻非零节点的数量,但我不知道可以做到这一点的软件包。
我正在寻找一种在 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 的盒子有多难的指示。我猜人们必须在更大的邻域中寻找相邻非零节点的数量,但我不知道可以做到这一点的软件包。