R语言:带自环的拼接网络图如何合理缩放?
解决带自环网络图拼接时的节点挤压与尺寸统一问题
问题核心是带自环的网络图会让ggraph自动扩展坐标范围以容纳自环,导致不同图表的坐标边界不一致:用coord_equal()时,patchwork会按各自的坐标范围缩放图表,出现尺寸差异;用theme(aspect.ratio = 1)则是强制图表比例,但不约束坐标范围,节点会被挤压适配比例。
最简洁的解决方法是统一所有图表的坐标范围,结合coord_equal()保证图形比例正常,具体步骤如下:
- 确定一个足够容纳所有图表(包括带自环的)的坐标范围——因为用的是
circle布局,节点默认分布在单位圆附近,自环需要额外空间,所以可以直接设置一个对称的范围,比如c(-1.5, 1.5)。 - 在每个
ggraph绘图代码中添加xlim()和ylim()固定这个范围,同时保留coord_equal()。 - 用patchwork拼接时,所有图表就会保持相同的尺寸,且节点不会被挤压。
修改后的代码如下:
library(ggraph) library(igraph) library(patchwork) set.seed(1) adj_mat <- matrix(runif(100, 0, 10), nrow=10) colnames(adj_mat) <- letters[10:1] diag(adj_mat) <- 0 # 创建图对象并绘图,固定坐标范围+coord_equal g <- graph_from_adjacency_matrix(adj_mat, weighted = T, diag = T) gg1 <- ggraph(g, layout = "circle") + geom_edge_link() + geom_edge_loop() + geom_node_circle(aes(r=0.15), fill = "orange") + geom_node_text(aes(label = colnames(adj_mat))) + coord_equal() + xlim(-1.5, 1.5) + ylim(-1.5, 1.5) # 添加自环后绘图,同样固定坐标范围 adj_mat[1, 1] = 5 g <- graph_from_adjacency_matrix(adj_mat, weighted = T, diag = T) gg2 <- ggraph(g, layout = "circle") + geom_edge_link() + geom_edge_loop() + geom_node_circle(aes(r=0.15), fill = "orange") + geom_node_text(aes(label = colnames(adj_mat))) + coord_equal() + xlim(-1.5, 1.5) + ylim(-1.5, 1.5) # 拼接图表,此时所有图尺寸统一且节点无挤压 gg1 + gg2 gg1 + gg1 + gg2 + gg1 + gg2 + gg2
如果需要更灵活的范围,可以先计算所有图的布局坐标最大值,再统一设置:
# 先获取所有图的布局坐标 layout1 <- create_layout(g, layout = "circle") layout2 <- create_layout(graph_from_adjacency_matrix(adj_mat, weighted = T, diag = T), layout = "circle") max_range <- max(abs(layout1$x), abs(layout1$y), abs(layout2$x), abs(layout2$y)) * 1.2 # 留20%余量 # 然后在绘图时用max_range设置xlim和ylim xlim(-max_range, max_range) + ylim(-max_range, max_range)
这样既能保证所有图表的坐标范围足够容纳内容,又能让patchwork拼接时保持一致的尺寸,同时coord_equal()确保节点和边的比例正常,不会出现挤压。
内容的提问来源于stack exchange,提问作者carl
相关产品推荐
相关产品推荐

