如何为空间点图数值变量设置颜色:阈值截断与配色调整
空间点图优化:数值截断与颜色映射调整
你已通过ggOceanMaps绘制全球范围空间点图,以下是针对两个需求的具体解决方案:
1. 对数值设置截断阈值(大于300统一用顶部颜色)
有两种高效实现方式:
方式一:数据预处理阶段截断
提前处理目标变量,将大于300的值替换为300,避免绘图时重复计算:
# 加载dplyr用于数据处理(若未安装先运行install.packages("dplyr")) library(dplyr) daten_neu <- daten_neu %>% mutate( # 先统一转换为数值型 Neogloboquadrina_pachyderma...35 = as.numeric(Neogloboquadrina_pachyderma...35), # 截断数值到300 truncated_value = pmin(Neogloboquadrina_pachyderma...35, 300) )
后续绘图时,在aes中使用truncated_value作为颜色映射变量即可。
方式二:颜色映射中直接设置截断(无需修改原始数据)
使用scales::squish函数,在颜色比例尺中定义范围,超出边界的数值会自动映射到对应边界颜色:
# 需加载scales包(若未安装先运行install.packages("scales")) library(scales) scale_color_gradient( limits = c(0, 300), # 设定颜色映射的数值范围 oob = scales::squish # 超出范围的数值被压缩到边界值 )
2. 调整颜色映射为深蓝到深红
直接在scale_color_gradient中指定low(低值颜色)和high(高值颜色)参数:
scale_color_gradient( low = "darkblue", # 低值对应深蓝色 high = "darkred" # 高值对应深红色 )
完整优化代码
结合两种需求的最终代码如下:
library(ggrepel) library(ggOceanMaps) library(ggspatial) library(readr) library(scales) library(dplyr) # 提前转换所有需要的变量类型,让代码更简洁 daten_neu <- daten_neu %>% mutate( Latitude = as.numeric(Latitude), Longitude = as.numeric(Longitude), Neogloboquadrina_pachyderma...35 = as.numeric(Neogloboquadrina_pachyderma...35) ) map <- basemap(c(-180, 180, -90, 90), bathymetry = TRUE) + ggspatial::geom_spatial_point( data = daten_neu, aes(x = Longitude, y = Latitude, color = Neogloboquadrina_pachyderma...35) ) + # 同时实现数值截断与颜色映射调整 scale_color_gradient( low = "darkblue", high = "darkred", limits = c(0, 300), oob = scales::squish, name = "N. pachyderma" # 自定义图例名称,提升可读性 ) print(map)
补充说明
- 提前转换数据类型能减少绘图时的重复计算,让代码逻辑更清晰;
scales::squish不仅会处理大于300的数值,若存在小于0的数值,也会自动映射到深蓝色;- 自定义图例名称可让图表更易理解,建议根据实际需求修改。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

