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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:47:46