如何让 rayshader 比例尺使用与地图一致的渐变配色?
能否直接设置完整渐变?
render_scalebar() 没有公开的连续渐变配色参数。color_first 和 color_second 用来设置交替分段的颜色;增加 segments 会增加分段数量,但不会自动将 RdYlBu 调色板插值成渐变。参数说明
如果目的是说明地图颜色对应的 LST 数值,建议另外添加温度色标,同时保留距离比例尺。原代码中的 limits = c(0, 5, 10) 和 label_unit = "km" 表示距离,与温度颜色映射是不同的信息。
要让距离比例尺本身呈现完整渐变,需要自行绘制 3D 几何体或改写比例尺的绘制逻辑。
添加与地图一致的 LST 渐变色标
对于最终导出的静态图片,可以先生成透明背景的色标 PNG,再用 render_snapshot(image_overlay = ...) 将它叠加到地图上。该参数支持透明 PNG;图片尺寸与快照不一致时,图片会缩放到快照尺寸。快照叠加参数说明
将下面的代码放在原代码的 render_compass(position = "NE") 后面,用它替换最后的 render_snapshot(clear = TRUE)。运行时应保留尚未清空的 3D 场景。
# Reuse the map palette and its data range
pal <- grDevices::colorRampPalette(
c("#313695", "#74add1", "#ffffbf", "#f46d43", "#a50026")
)(256)
lst_range <- range(lst_matrix, na.rm = TRUE)
stopifnot(all(is.finite(lst_range)), diff(lst_range) > 0)
legend_values <- seq(
from = lst_range[1],
to = lst_range[2],
length.out = 5
)
# Match the dimensions used in windowsize
legend_file <- "lst_legend.png"
grDevices::png(
filename = legend_file,
width = 1200,
height = 800,
bg = "transparent"
)
grid::grid.newpage()
# White backing for readable labels
grid::grid.rect(
x = 0.5, y = 0.09,
width = 0.70, height = 0.14,
gp = grid::gpar(fill = "white", col = NA)
)
# Low values on the left, high values on the right
grid::grid.raster(
image = as.raster(matrix(pal, nrow = 1)),
x = 0.5, y = 0.09,
width = 0.60, height = 0.025,
interpolate = FALSE
)
grid::grid.text(
label = "LST",
x = 0.5, y = 0.135,
gp = grid::gpar(fontsize = 12)
)
grid::grid.text(
label = sprintf("%.1f", legend_values),
x = seq(0.20, 0.80, length.out = 5),
y = 0.05,
gp = grid::gpar(fontsize = 11)
)
grDevices::dev.off()
rayshader::render_snapshot(
filename = "london_lst_with_legend.png",
image_overlay = legend_file,
clear = TRUE
)
这段代码生成的二维渐变色标会叠加在快照上,原有距离比例尺仍会保留。色标位置由 grid 的相对坐标控制,如果遮挡地图,可以调整 x、y、width 和 height。
原代码中的 height_shade() 没有指定 range,默认按矩阵的完整数值范围映射颜色,因此色标使用 range(lst_matrix, na.rm = TRUE) 与之对应。如果之后显式指定颜色映射范围,色标也要使用相同的范围。颜色映射范围说明
只调整距离比例尺的配色
如果只希望距离比例尺与地图风格协调,可以从原调色板中选取两种颜色。将原来的比例尺调用替换为:
render_scalebar(
limits = c(0, 5, 10),
label_unit = "km",
position = "W",
scale_length = c(0.33, 1),
color_first = "#313695",
color_second = "#a50026"
)
这样得到的仍是双色交替比例尺,不会形成从蓝色经过黄色到红色的完整渐变。
使用时需要注意什么?
- 色标的颜色顺序和数值范围必须与地图一致。当前给出的顺序是低值蓝色、高值红色。
- 示例没有明确温度单位,因此代码只标注
LST。确认数据单位后,可以改成例如LST (°C)。 scale_length控制比例尺相对于地图边长的长度,limits设置距离标注。不能仅凭写入10 km就认定实际长度正确,应结合栅格分辨率和所选地图边核对。比例尺长度与标注说明clear = TRUE会在快照完成后清空当前场景。如果还需要调整相机或导出其他图片,先使用clear = FALSE。场景清理参数说明
备注:内容仅供参考。
