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

如何为空间点图数值变量设置颜色:阈值截断与配色调整

空间点图优化:数值截断与颜色映射调整

你已通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:40:31