R语言rayshader绘制3D ggplot时Z轴数值异常求助
解决rayshader绘制加密货币3D ggplot的两个问题
问题1:Z轴无数据显示
先排查以下几点:
- 确认数据类型:确保
volume是数值型(用class(your_data$volume)检查),如果是字符型转成数值:your_data$volume <- as.numeric(your_data$volume) - 使用支持Z轴映射的geom:别用
geom_line这类仅二维的图层,改用geom_raster()、geom_tile()或stat_summary_2d来绑定Z轴数据。比如:library(ggplot2) p <- ggplot(your_data, aes(x = time, y = price, fill = volume)) + geom_raster() + scale_fill_viridis_c() - 检查映射逻辑:rayshader是基于ggplot的颜色/填充值生成Z轴高度的,所以必须把
volume绑定到fill或color参数,而非直接在aes里写z=volume(ggplot本身无原生Z轴)。
问题2:Z轴极值导致比例异常
plot_gg的scale参数是调整整体图形缩放,不会改变Z轴数值的相对比例,解决办法如下:
方法1:对Z轴数据做变换
用对数、平方根等变换压缩极值的影响,示例:
# 对数变换(+1避免0值报错) p <- ggplot(your_data, aes(x = time, y = price, fill = log(volume + 1))) + geom_raster() + scale_fill_viridis_c(name = "Volume (log)") # 平方根变换 p <- ggplot(your_data, aes(x = time, y = price, fill = sqrt(volume))) + geom_raster() + scale_fill_viridis_c(name = "Volume (sqrt)")
方法2:截断极值范围
手动设定Z轴(填充值)的上下限,忽略超出范围的极值,示例:
# 用分位数设定上限(比如取95%分位数) upper_limit <- quantile(your_data$volume, 0.95, na.rm = TRUE) lower_limit <- min(your_data$volume, na.rm = TRUE) p <- ggplot(your_data, aes(x = time, y = price, fill = volume)) + geom_raster() + scale_fill_viridis_c(limits = c(lower_limit, upper_limit), oob = scales::squish)
oob = scales::squish会把超出上下限的数值压缩到边界值,避免图形出现断层。
方法3:在rayshader中调整Z轴缩放
用plot_gg的zscale参数(注意不是scale),这个参数控制Z轴高度的缩放比例,数值越小,Z轴高度越平缓,示例:
library(rayshader) plot_gg(p, zscale = 0.1, # 减小这个值让Z轴高度更平缓 theta = 30, phi = 30, windowsize = c(800, 600))
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

