在R的RGL设备中用rayshader为3D绘图添加平面2D图像
解决RGL 3D绘图中添加平面2D图像的问题
问题根源是plot_gg会将ggplot中的所有元素(包括annotation_custom的grob)投射到3D表面,导致图像跟着场景变形。以下是可行的代码方案,通过rgl原生的2D叠加功能实现平面图像的固定显示:
完整代码
library(rayshader) library(sf) library(ggplot2) library(grid) library(magick) # 读取图像并转为网格对象(grob) image <- magick::image_read("image.png") image_grob <- rasterGrob(image, interpolate = TRUE, width = unit(1.5, 'cm'), x = unit(1, "npc"), y = unit(1, "npc"), hjust = 1, vjust = 1) # 读取地图并创建不含叠加元素的ggplot map <- sf::st_read('map/map.shp', quiet = TRUE) gg <- ggplot(map) + geom_sf() + geom_sf(aes(fill = AREA), linewidth = 0.7, colour = 'black') + scale_fill_gradient('Area', low = 'skyblue', high = 'dodgerblue4', na.value = 'white') + theme_bw() + theme(axis.line = element_blank(), axis.title = element_blank(), axis.ticks = element_blank(), axis.text = element_blank()) # 生成3D场景 plot_gg(gg, height = 8.5, width = 9, multicore = TRUE, windowsize = c(1050, 600), offset_edges = TRUE) # 关键:用rgl的overlay在2D层添加平面图像 rgl::overlay(rgl::currentSubscene(), { grid.newpage() grid.draw(image_grob) })
原理说明
rgl::overlay()会在RGL设备的独立2D叠加层绘制元素,完全不受3D场景的透视、变形影响,图像会固定在窗口的指定位置(这里是右上角)。- 如果需要覆盖整个背景,也可以使用
rgl::bgplot3d(),但overlay()更适合添加局部的logo、标注类图像。
内容的提问来源于stack exchange,提问作者Eriza
相关产品推荐
相关产品推荐

