如何在R中可视化1000×1000邻接矩阵以观测聚类情况?
如何在R中鸟瞰邻接矩阵的社区聚类分布(随机块模型生成)
嘿,我完全懂你想要的那种「上帝视角」——不用靠热力图的颜色渐变,直接看清矩阵里0和1的区块分布,验证随机块模型生成的100个社区是不是真的呈现出你设置的聚类特征对吧?刚好你的SBM设置是社区内部连接概率低(0.01)、社区间连接概率反而更高(0.07),这种反常规的结构反而更需要直观的可视化来确认。
下面给你两种可复现的方法,核心都是先把节点按社区排序(这步很关键!不排序的话矩阵是乱的,根本看不到聚类),再用黑白块直接展示0/1分布:
第一步:预处理邻接矩阵(按社区排序)
首先补全你的代码,提取节点的社区归属,然后对邻接矩阵的行和列按社区排序,让同社区的节点集中在一起:
library(igraph) # 生成你设置的SBM网络 pref.matrix <- matrix(rep(0.07, 100*100), ncol = 100) diag(pref.matrix) <- rep(0.01, 100) g <- sample_sbm(1000, pref.matrix = pref.matrix, block.sizes = rep(10, 100)) A <- as.matrix(as_adj(g)) # 提取每个节点的社区ID,然后排序邻接矩阵 block_ids <- membership(g) # 按社区顺序重新排列行和列,同社区节点会被放在一起 A_sorted <- A[order(block_ids), order(block_ids)]
方法1:Base R快速鸟瞰(极简高效)
用Base R的image()函数,直接生成黑白块的矩阵视图,没有多余元素,最适合快速验证:
# 调整绘图边距,让矩阵占满整个画布 par(mar = c(0, 0, 0, 0)) # 转置+反转行是为了让矩阵显示顺序和我们平时看的一致 image(t(A_sorted)[nrow(A_sorted):1, ], col = c("white", "black"), # 0用白色,1用黑色 axes = FALSE, # 去掉坐标轴,避免干扰 main = "邻接矩阵鸟瞰图(按社区排序)")
运行后你会看到:白色的小方块是社区内部(因为连接少),黑色的大片区域是社区之间的连接(连接多),完美对应你设置的SBM参数。
方法2:ggplot2美化版(带社区分隔线)
如果想要更清晰的社区边界,可以用ggplot2实现,还能添加灰色分隔线标记100个社区的边界:
library(ggplot2) library(reshape2) # 把排序后的矩阵转成长格式,适配ggplot2 A_melted <- melt(A_sorted) colnames(A_melted) <- c("row", "col", "value") # 计算社区分隔的位置(每个社区10个节点) block_breaks <- seq(10, 990, by = 10) ggplot(A_melted, aes(x = col, y = row)) + geom_tile(aes(fill = factor(value)), color = NA) + scale_fill_manual(values = c("0" = "white", "1" = "black")) + # 添加社区分隔线 scale_x_continuous(breaks = block_breaks, minor_breaks = NULL) + scale_y_reverse(breaks = block_breaks, minor_breaks = NULL) + geom_vline(xintercept = block_breaks + 0.5, color = "gray50", size = 0.2) + geom_hline(yintercept = block_breaks + 0.5, color = "gray50", size = 0.2) + # 去掉多余的主题元素 theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0.5)) + labs(title = "邻接矩阵社区聚类鸟瞰(带社区分隔线)")
这个图里的灰色细线就是100个社区的边界,你能非常直观地看到每个社区内部的稀疏连接(白色)和社区之间的密集连接(黑色),完全能验证你的SBM是否生成了预期的聚类结构。
内容的提问来源于stack exchange,提问作者user321627
相关产品推荐
相关产品推荐

