PAYATHON 2026

如何让 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。场景清理参数说明

备注:内容仅供参考。