如何用循环在R的igraph包中绘制带标注多面板网络图并导出PNG
R语言igraph多面板网络图绘制修复方案
核心错误原因
你当前仅输出1个网络的问题出在循环写法:for (i in length(listofsrs_nws)) 中length(listofsrs_nws)仅返回单个数值3,循环只会执行1次(仅遍历i=3的最后一个网络),修改为遍历全量索引即可解决。
完整可运行代码(含PNG导出、子图标注)
library(igraph) # 示例网络和聚类结果准备 srs_1nw <- graph("Zachary") srs_2nw <- graph("Heawood") srs_3nw <- graph("Folkman") srs_1c <- cluster_fast_greedy(srs_1nw) srs_2c <- cluster_fast_greedy(srs_2nw) srs_3c <- cluster_fast_greedy(srs_3nw) listofsrs_nws <- list(srs_1nw,srs_2nw,srs_3nw) listofsrs_cs <- list(srs_1c,srs_2c,srs_3c) colours <- c("red","blue","green","yellow") # 开启PNG导出设备,可自行调整宽高、分辨率、保存路径 png("多面板网络图.png", width = 1200, height = 800, res = 150) # 设置2行3列布局,调整边距避免内容拥挤 par(mfrow=c(2,3), mar = c(2,1,1,1)) # 修正循环写法,遍历所有网络 for (i in seq_along(listofsrs_nws)) { c <- listofsrs_cs[[i]] nw <- listofsrs_nws[[i]] # 保留你要求的V/E格式修改网络属性,加1避免孤立节点log(0)报错 V(nw)$size <- log(strength(nw) + 1)*6 E(nw)$arrow.size <- 2 # 有向图生效,无向图不影响运行 c.colours <- colours[membership(c)] plot(c, nw, col = c.colours, mark.col = adjustcolor(colours, alpha.f = 0.4), mark.border = adjustcolor(colours, alpha.f = 1), vertex.frame.width = 5, edge.curved = .15) # 子图角落标注A-F,加粗字号可自行调整 mtext(LETTERS[i], side = 3, adj = 0.05, font = 2, cex = 1.3, col = "black") } # 关闭绘图设备,完成PNG导出 dev.off()
代码说明
- 循环改用
seq_along(listofsrs_nws)自动适配列表内的网络数量,后续新增3个网络到两个列表中,即可自动填满2行3列的6个位置,标注也会自动顺延到F - 保留了你要求的
V(nw)$xxx/E(nw)$xxx格式的属性修改逻辑,不影响原有出图效果 mtext函数实现子图编号标注,side=3表示放在顶部,adj=0.05表示靠左对齐,可根据需求调整位置和样式- 你可以按需修改
png()函数的参数调整导出图片的尺寸、分辨率和保存路径
内容的提问来源于stack exchange,提问作者user13822027
相关产品推荐
相关产品推荐

