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

为基于字段值着色的Voronoi图添加连续图例的实现方法问询

基于字段值着色的Voronoi图添加连续图例的实现方法问询

你好呀!看起来你已经用terra包做出了基于人口数据着色的Voronoi图,现在就差一个能对应颜色和数值的连续图例啦~我来帮你搞定这个问题!

首先先明确你的需求:你已经完成了Voronoi图的绘制,并且用归一化后的人口值给区域配上了从黑色到浅灰色的渐变颜色,现在需要添加一个连续的图例来展示颜色对应的实际数值范围。

你当前已实现的代码:

library(terra)

f <- system.file("ex/lux.shp", package="terra")
e <- vect(f)
x <- centroids(e)
v <- voronoi(x, e)
v <- terra::crop(v, e)

FUN <- colorRamp(c("black", "lightgrey"))
vpop <- (v$POP - min(v$POP)) / diff(range(v$POP))
vcols <- rgb(FUN(vpop), maxColorValue = 256)

plot(v, lwd = 2, col = vcols, 
     main = "Voronoi Diagram", 
     background = "beige"
     )
points(x, col = "red")

当前运行代码后生成的图:带有红色站点标记、米色背景,区域颜色随人口值渐变的Voronoi图。

解决方案:添加连续图例

下面提供两种可行的方法,你可以根据需求选择:

方法一:使用fields包快速生成连续图例

fields包的image.plot函数可以便捷地生成匹配数值范围的连续色条图例,步骤如下:

  1. 安装并加载fields包(如果还没安装的话)
  2. 调整绘图边距,给右侧的图例留出空间
  3. 绘制主图后调用image.plot添加图例

修改后的完整代码:

library(terra)
library(fields) # 加载用于添加连续图例的包

f <- system.file("ex/lux.shp", package="terra")
e <- vect(f)
x <- centroids(e)
v <- voronoi(x, e)
v <- terra::crop(v, e)

FUN <- colorRamp(c("black", "lightgrey"))
vpop <- (v$POP - min(v$POP)) / diff(range(v$POP))
vcols <- rgb(FUN(vpop), maxColorValue = 256)

# 调整绘图边距,右侧预留图例空间
par(mar = c(5, 4, 4, 6) + 0.1) 
plot(v, lwd = 2, col = vcols, 
     main = "Voronoi Diagram", 
     background = "beige"
)
points(x, col = "red")

# 添加连续图例,对应原始人口数值范围
image.plot(
  zlim = range(v$POP), 
  col = rgb(FUN(seq(0,1,length=100)), maxColorValue=256), # 生成平滑渐变的颜色条
  legend.only = TRUE,
  legend.width = 1,
  legend.mar = 8,
  axis.args = list(at = seq(min(v$POP), max(v$POP), length=5), # 设置刻度点
                   labels = round(seq(min(v$POP), max(v$POP), length=5)),
                   cex.axis = 0.8)
)

这个方法的优势是简单快捷,自动匹配颜色渐变和数值范围,生成的图例直观清晰。

方法二:用Base R手动构建连续图例(无需额外包)

如果你不想安装新包,可以用Base R的原生函数手动绘制图例,灵活性更高:

library(terra)

f <- system.file("ex/lux.shp", package="terra")
e <- vect(f)
x <- centroids(e)
v <- voronoi(x, e)
v <- terra::crop(v, e)

FUN <- colorRamp(c("black", "lightgrey"))
vpop <- (v$POP - min(v$POP)) / diff(range(v$POP))
vcols <- rgb(FUN(vpop), maxColorValue = 256)

# 调整绘图边距,右侧预留图例空间
par(mar = c(5,4,4,6))
plot(v, lwd = 2, col = vcols, 
     main = "Voronoi Diagram", 
     background = "beige"
)
points(x, col = "red")

# 手动绘制连续颜色条
legend_pos <- par("usr")[2] + 0.1 # 图例的起始x坐标
legend_height <- diff(par("usr")[3:4])
n_colors <- 100 # 颜色条的渐变精度
color_seq <- rgb(FUN(seq(0,1,length=n_colors)), maxColorValue=256)
y_seq <- seq(par("usr")[3], par("usr")[4], length=n_colors)

# 绘制渐变矩形块
for(i in 1:(n_colors-1)){
  rect(legend_pos, y_seq[i], legend_pos+0.1, y_seq[i+1], col=color_seq[i], border=NA)
}
# 给颜色条加边框
rect(legend_pos, par("usr")[3], legend_pos+0.1, par("usr")[4], border="black")

# 添加数值刻度和标签
axis(4, at=seq(par("usr")[3], par("usr")[4], length=5), 
     labels=round(seq(min(v$POP), max(v$POP), length=5)), 
     line=0.5, cex.axis=0.8)
mtext("Population", side=4, line=2.5, cex=0.9)

这个方法完全依赖Base R函数,不需要安装额外包,你可以根据需求调整图例的位置、宽度、刻度数量等细节。

备注:内容来源于stack exchange,提问作者Alexander Klug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:05:31