为基于字段值着色的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函数可以便捷地生成匹配数值范围的连续色条图例,步骤如下:
- 安装并加载
fields包(如果还没安装的话) - 调整绘图边距,给右侧的图例留出空间
- 绘制主图后调用
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
相关产品推荐
相关产品推荐

