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

R中mgcv包vis.gam绘制persp图时调整坐标轴间距问题咨询

问题根源

修改par(mgp=...)不生效的核心原因:vis.gam()封装persp()绘制三维透视图时,三维轴的绘制逻辑和R基础二维绘图完全不同,不会继承全局mgp参数设置,且persp()本身没有直接开放轴间距调整参数给上层调用,因此无论怎么修改全局mgp取值,都不会改变出图效果。

实现方案

不要依赖vis.gam()自动生成的轴元素,先关闭默认轴绘制,拿到函数返回的透视投影矩阵后手动自定义所有轴元素,即可完全控制两类间距:

  • 运行vis.gam()时设置axes=FALSE,清空默认轴标题,将返回的透视变换矩阵存入变量
  • 基于变换矩阵,手动绘制外框、刻度线、刻度标签、轴标题,通过位置偏移参数自由调整间距

对应代码如下:

library(mgcv)
# 第一步:关闭默认轴绘制,存储透视变换矩阵
trans_mat <- vis.gam(
  x = a1b,
  view = c("wbgt_max", "lag"),
  plot.type = "persp",
  axes = FALSE, # 关闭默认坐标轴、刻度、标签
  xlab = "", ylab = "", zlab = "", # 清空默认轴标题
  theta = 60,
  phi = 15,
  r = sqrt(3),
  d = 1,
  type = "response",
  col = "lightblue" # 可自行修改曲面配色
)

# 获取三个变量的取值范围,生成和默认ticktype="detailed"一致的刻度
x_range <- range(a1b$model$wbgt_max, na.rm = TRUE)
y_range <- range(a1b$model$lag, na.rm = TRUE)
z_range <- range(predict(a1b, type = "response"), na.rm = TRUE)
x_ticks <- pretty(x_range)
y_ticks <- pretty(y_range)
z_ticks <- pretty(z_range)

# 绘制三维图外框
perspbox(x_range, y_range, z_range, trans = trans_mat, axes = FALSE)

# --------------参数调整规则--------------
# 1. 刻度线与刻度标签的间距:修改text()中的offset参数,数值越大间距越大
# 2. 刻度标签与轴标题的间距:修改轴标题位置的偏移系数(代码中为0.15),数值越大间距越大
# ----------------------------------------

# 绘制x轴(max WBGT)
lines(trans3d(x_ticks, min(y_ticks), min(z_ticks), pmat = trans_mat))
text(
  trans3d(x_ticks, min(y_ticks), min(z_ticks), pmat = trans_mat),
  labels = x_ticks, pos = 1, offset = 1.2 # 调整offset改刻度-标签间距
)
text(
  trans3d(median(x_ticks), min(y_ticks), min(z_ticks) - diff(z_range)*0.15, pmat = trans_mat),
  labels = "max WBGT (°C)", font = 1
)

# 绘制y轴(lag days)
lines(trans3d(min(x_ticks), y_ticks, min(z_ticks), pmat = trans_mat))
text(
  trans3d(min(x_ticks), y_ticks, min(z_ticks), pmat = trans_mat),
  labels = y_ticks, pos = 2, offset = 1.2
)
text(
  trans3d(min(x_ticks), median(y_ticks), min(z_ticks) - diff(z_range)*0.15, pmat = trans_mat),
  labels = "lag (days)", font = 1
)

# 绘制z轴(deaths)
lines(trans3d(min(x_ticks), min(y_ticks), z_ticks, pmat = trans_mat))
text(
  trans3d(min(x_ticks), min(y_ticks), z_ticks, pmat = trans_mat),
  labels = z_ticks, pos = 2, offset = 1.2
)
text(
  trans3d(min(x_ticks) - diff(x_range)*0.15, min(y_ticks), median(z_ticks), pmat = trans_mat),
  labels = "deaths", font = 1, srt = 90
)

微调时可以先从offset=1、标题偏移系数0.1开始试,根据实际出图效果逐步增减数值,直到间距符合需求即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:57:27