You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统一RLQ分析子图的网格单元格大小?

RLQ分析绘图:统一子图网格单元格大小的解决方案

问题核心

你需要统一RLQ分析四个子图的网格单元格大小,同时解决adegraphics布局中子图异常、间距过大的问题,关键在于统一所有子图的坐标轴范围,并直接控制网格单元格的实际尺寸。


解决方案1:使用adegraphics实现统一网格

步骤说明

  1. 先计算所有绘图数据的共同坐标轴范围,确保四个子图的x/y轴范围完全一致,这是网格单元格大小统一的基础。
  2. 在每个绘图函数中指定统一的xlim/ylim,同时用pgrid.d直接设置网格单元格的长度(可根据需求调整数值)。
  3. 调整ADEgS的between参数,缩小子图之间的间距。

修改后的完整代码

library(ade4)
library(adegraphics)
data(aravo)

# 执行RLQ分析
veg_coa <- dudi.coa(aravo$spe, scannf=FALSE, nf=2)
tra_pca <- dudi.pca(aravo$traits, scannf=FALSE, row.w=veg_coa$cw)
suo_pca <- dudi.hillsmith(aravo$env, scannf=FALSE, row.w=veg_coa$lw) 
rlq_tra <- rlq(suo_pca, veg_coa, tra_pca, scannf=FALSE)

# 计算所有子图的统一坐标轴范围(留10%余量避免标签被截断)
all_coords <- rbind(rlq_tra$l1$coord, rlq_tra$c1$coord, rlq_tra$lQ$coord, rlq_tra$lR$coord)
x_range <- range(all_coords[,1]) * 1.1
y_range <- range(all_coords[,2]) * 1.1

# 创建统一坐标轴和网格的子图
a <- s.arrow(rlq_tra$l1, xlim = x_range, ylim = y_range, pgrid.d = 0.5)
b <- s.arrow(rlq_tra$c1, xlim = x_range, ylim = y_range, pgrid.d = 0.5)
c <- s.label(rlq_tra$lQ, plabels.boxes.alpha = 0, ppoints.alpha = 0, 
             xlim = x_range, ylim = y_range, pgrid.d = 0.5)
d <- s.label(rlq_tra$lR, plabels.boxes.alpha = 0, ppoints.alpha = 0, 
             xlim = x_range, ylim = y_range, pgrid.d = 0.5)

# 组合子图并调整间距
ADEgS(list(a, b, c, d), layout = c(2, 2), between = list(x = 0.1, y = 0.1))

参数解释

  • pgrid.d:直接控制网格单元格的实际长度,所有子图设为相同值即可保证单元格大小统一。
  • xlim/ylim:强制所有子图使用相同的坐标轴范围,避免因数据范围不同导致网格缩放不一致。
  • between:减小子图之间的水平/垂直间距,解决布局过于松散的问题。

解决方案2:使用ade4基础绘图实现统一网格

如果更习惯基础绘图系统,可以通过统一坐标轴范围+手动添加网格的方式实现:

library(ade4)
data(aravo)

# 执行RLQ分析
veg_coa <- dudi.coa(aravo$spe, scannf=FALSE, nf=2)
tra_pca <- dudi.pca(aravo$traits, scannf=FALSE, row.w=veg_coa$cw)
suo_pca <- dudi.hillsmith(aravo$env, scannf=FALSE, row.w=veg_coa$lw) 
rlq_tra <- rlq(suo_pca, veg_coa, tra_pca, scannf=FALSE)

# 计算统一坐标轴范围
all_coords <- rbind(rlq_tra$l1$coord, rlq_tra$c1$coord, rlq_tra$lQ$coord, rlq_tra$lR$coord)
x_range <- range(all_coords[,1]) * 1.1
y_range <- range(all_coords[,2]) * 1.1

# 设置绘图布局和边距
par(mfrow = c(2, 2), mar = c(2, 2, 1, 1))

# 绘制子图并添加统一网格
ade4::s.arrow(rlq_tra$l1, xlim = x_range, ylim = y_range)
grid(nx = 6, ny = 6, lwd = 0.5) # 统一网格数量,保证单元格大小一致

ade4::s.arrow(rlq_tra$c1, xlim = x_range, ylim = y_range)
grid(nx = 6, ny = 6, lwd = 0.5)

ade4::s.label(rlq_tra$lQ, boxes = FALSE, xlim = x_range, ylim = y_range)
grid(nx = 6, ny = 6, lwd = 0.5)

ade4::s.label(rlq_tra$lR, boxes = FALSE, xlim = x_range, ylim = y_range)
grid(nx = 6, ny = 6, lwd = 0.5)

内容的提问来源于stack exchange,提问作者Gabriel Cainelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:09:51