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
相关产品推荐
相关产品推荐

