如何在rgl 3D绘图中为对数变换的z轴设置原始值标签?
解决rgl包3D图z轴对数变换后显示原始值的问题
你可以通过自定义z轴刻度与标签实现类似ggplot2中scale_y_continuous(trans="log10")的效果,核心是保留对数变换后的3D视觉形态,同时将轴标签替换为原始数值。
方案1:保留原始数据,绘图时做对数变换(推荐)
这种方式避免提前修改数据导致混淆,逻辑更清晰:
# 生成原始数据,不提前做对数变换 x <- seq(1, 2, length = 10) y <- seq(1, 3, length = 10) z_raw <- outer(x, y, function(x, y) x + exp(y)) # 基于对数变换后的z值绘制3D图 rgl::persp3d(x, y, log(z_raw), col = "white") rgl::surface3d(x, y, log(z_raw), front = "lines") # 自定义z轴:计算对数刻度位置与对应原始值标签 z_log_range <- range(log(z_raw)) # 生成对数空间的刻度(可根据需求调整间隔) z_ticks_log <- seq(floor(z_log_range[1]), ceiling(z_log_range[2]), by = 1) # 转换为原始数值作为标签,保留1位小数 z_ticks_raw <- round(exp(z_ticks_log), 1) # 替换默认z轴 rgl::axis3d("z", at = z_ticks_log, labels = z_ticks_raw)
方案2:基于已变换的z值修改轴标签
如果坚持使用已做对数变换的变量,可直接对现有图形调整轴标签:
# 你的原始代码 x <- seq(1, 2, length = 10); y <- seq(1, 3, length = 10) z <- outer(x, y, function(x, y) x + exp(y)); z_log <- log(z) rgl::persp3d(x, y, z_log, col= "white") rgl::surface3d(x, y, z_log, front = "lines") # 自定义z轴 z_log_range <- range(z_log) z_ticks_log <- seq(floor(z_log_range[1]), ceiling(z_log_range[2]), by = 1) z_ticks_raw <- round(exp(z_ticks_log), 1) # 替换默认z轴 rgl::axis3d("z", at = z_ticks_log, labels = z_ticks_raw)
优化刻度分布
如果原始数值范围较大,可按原始值的对数间隔生成刻度,让标签分布更均匀:
# 按原始值的等对数间隔生成5个刻度 z_raw_ticks <- seq(exp(z_log_range[1]), exp(z_log_range[2]), length.out = 5) z_log_ticks <- log(z_raw_ticks) rgl::axis3d("z", at = z_log_ticks, labels = round(z_raw_ticks, 1))
内容的提问来源于stack exchange,提问作者LulY
相关产品推荐
相关产品推荐

