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

如何使用R和ggplot2绘制naturalearth栅格图层的自然色效果

自然地球栅格底图在ggplot2中渲染原生自然色的解决方法

问题原因

你使用raster()读取的自然地球带色底图为单波段索引色栅格,栅格存储的整数值为颜色索引而非连续强度值,ggplot默认将整数值识别为连续变量映射默认色阶,因此无法还原原生调色效果。

解决方案

方案1:使用terra包处理(推荐,内存占用更低)

terra是新一代栅格处理包,比传统raster包效率更高,裁剪后再转数据框可完全避免全量转换导致的崩溃问题,代码如下:

library(tidyverse)
library(terra)

# 读取栅格文件
hills <- rast("./map_data/NE1_LR_LC_SR_W_DR.tif")
# 先按目标范围裁剪,再转数据框,大幅降低内存消耗
hills_crop <- crop(hills, ext(-90, -55, -30, 5))
hills_df <- as.data.frame(hills_crop, xy = T)

# 提取栅格内置的原生调色板
col_table <- coltab(hills_crop)[[1]]
fill_scale <- setNames(
  rgb(col_table$red, col_table$green, col_table$blue, maxColorValue = 255),
  col_table$value
)

# 绘图
ggplot(hills_df) +
  geom_raster(aes(x = x, y = y, fill = as.factor(NE1_LR_LC_SR_W_DR))) +
  scale_fill_manual(values = fill_scale) +
  guides(fill = "none") + # 移除冗余的颜色索引图例
  coord_sf() # 保证地图投影比例正确,适配后续geom_sf/geom_point图层

方案2:使用raster包处理

如果习惯使用传统raster包,可直接读取栅格自带的调色板实现渲染:

library(tidyverse)
library(raster)

hills <- raster("./map_data/NE1_LR_LC_SR_W_DR.tif")
# 先裁剪再转数据框
hills_crop <- crop(hills, extent(-90, -55, -30, 5))
hills_df <- as.data.frame(hills_crop, xy = T)

# 提取内置调色板,R索引从1开始,颜色索引值需+1匹配
col_table <- hills_crop@legend@colortable
used_vals <- unique(hills_df$NE1_LR_LC_SR_W_DR)
fill_scale <- setNames(col_table[used_vals + 1], as.character(used_vals))

# 绘图逻辑和方案1一致
ggplot(hills_df) +
  geom_raster(aes(x = x, y = y, fill = as.factor(NE1_LR_LC_SR_W_DR))) +
  scale_fill_manual(values = fill_scale) +
  guides(fill = "none") +
  coord_sf()

注意事项

  • 所有裁剪操作必须在转数据框前完成,可减少90%以上的内存占用,完全避免R崩溃问题
  • 将fill映射的字段转成因子是核心步骤,可强制ggplot将索引值识别为分类变量匹配手动色板
  • coord_sf()可保证底图和后续叠加的sf对象、点要素的坐标系完全匹配,不会出现偏移

内容的提问来源于stack exchange,提问作者Tarotis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:09