如何基于多因子得分给地图点赋予RGB/HSV混合颜色?
基于因子得分的复合颜色空间地图绘制方案
核心思路
将三个因子得分分别映射到RGB/HSV颜色空间的三个通道,首先需把存在正负值的因子得分归一化到颜色通道要求的0-1区间,再生成对应复合颜色,最后绘制空间点位。
步骤实现
1. 归一化因子得分
因子得分通常包含正负值,而RGB/HSV的通道值需在0-1范围内,用手动实现的归一化函数处理:
# 归一化函数(将数值线性缩放到0-1区间) normalize <- function(x) { (x - min(x)) / (max(x) - min(x)) } # 对三个因子得分做归一化处理 fas$MR1_norm <- normalize(fas$MR1) fas$MR2_norm <- normalize(fas$MR2) fas$MR3_norm <- normalize(fas$MR3)
2. 生成复合颜色
方式一:RGB颜色映射
将三个归一化后的因子分别对应红、绿、蓝通道,直接生成RGB颜色:
fas$rgb_color <- rgb(fas$MR1_norm, fas$MR2_norm, fas$MR3_norm)
方式二:HSV颜色映射
若偏好HSV色彩空间,可将因子分别映射到色相(H)、饱和度(S)、明度(V):
# MR1对应色相,MR2对应饱和度,MR3对应明度 fas$hsv_color <- hsv(fas$MR1_norm, fas$MR2_norm, fas$MR3_norm)
3. 绘制复合颜色地图
修改原有绘图逻辑,使用生成的复合颜色作为点的填充色:
# RGB版本绘图函数 map_rgb <- function() { plot(fas, pch=21, cex=.8, col="black", bg=fas$rgb_color) # 添加图例说明因子与颜色通道的对应关系 legend("topright", legend=c("MR1 (红通道)", "MR2 (绿通道)", "MR3 (蓝通道)"), fill=c(rgb(1,0,0), rgb(0,1,0), rgb(0,0,1)), bty="n") } # HSV版本绘图函数 map_hsv <- function() { plot(fas, pch=21, cex=.8, col="black", bg=fas$hsv_color) legend("topright", legend=c("MR1 (色相)", "MR2 (饱和度)", "MR3 (明度)"), fill=c(hsv(1,1,1), hsv(0,1,1), hsv(0,0,1)), bty="n") } # 调用绘图(二选一) map_rgb() # map_hsv()
完整代码整合
library(sp) library(classInt) # 示例数据集 fas <- structure(list(MR1 = c(-0.604222013102789, -0.589631093835467, -0.612647301042234, 2.23360319770647, -0.866779007222414), MR2 = c(-0.492209397489792, -0.216810726717787, -0.294487678489753, -0.60466348557844, 0.34752411748663 ), MR3 = c(-0.510065798219453, -0.61303212834454, 0.194263734935779, 0.347461766159926, -0.756375966467285), x = c(1457543.717, 1491550.224, 1423185.998, 1508232.145, 1521316.942), y = c(4947666.766, 5001394.895, 4948766.5, 4950547.862, 5003955.997)), row.names = c("Acqui Terme", "Alagna", "Alba", "Albera Ligure", "Albuzzano"), class = "data.frame") # 创建空间对象 fas <- SpatialPointsDataFrame(fas[,4:5], fas, proj4string = CRS("+init=EPSG:3003")) # 归一化函数 normalize <- function(x) { (x - min(x)) / (max(x) - min(x)) } # 归一化因子得分 fas$MR1_norm <- normalize(fas$MR1) fas$MR2_norm <- normalize(fas$MR2) fas$MR3_norm <- normalize(fas$MR3) # 生成RGB颜色 fas$rgb_color <- rgb(fas$MR1_norm, fas$MR2_norm, fas$MR3_norm) # RGB绘图函数 map_rgb <- function() { plot(fas, pch=21, cex=.8, col="black", bg=fas$rgb_color) legend("topright", legend=c("MR1 (红通道)", "MR2 (绿通道)", "MR3 (蓝通道)"), fill=c(rgb(1,0,0), rgb(0,1,0), rgb(0,0,1)), bty="n") } # 执行绘图 map_rgb()
注意事项
- 若三个因子得分的动态范围差异较大,可先使用
scale()做标准化处理,再进行归一化,避免单一因子对颜色的主导性过强。 - HSV空间的色相通道对数值变化更敏感,适合突出某一因子的差异;RGB空间则更直观,三个因子的色彩贡献更均衡。
内容的提问来源于stack exchange,提问作者eazyezy
相关产品推荐
相关产品推荐

