ggplot2中coord_sf设crs=4326或自定义坐标轴标签异常问题
ggplot2绘制WGS84(4326)栅格地图的刻度标签修复方案
针对你遇到的两个问题,直接给可行的修复方案和代码:
问题1:coord_sf(crs=4326)下x轴仅显示-180/180刻度
这是因为强制指定WGS84投影后,ggplot2的自动刻度计算会默认只显示极值。解决核心是手动指定刻度断点,同时自定义标签添加方位符号。
问题2:scale_y_continuous自定义标签后x轴异常
单独设置y轴刻度会打破coord_sf的投影刻度对齐逻辑,需要同时统一处理x、y轴的刻度和标签,避免投影与刻度规则冲突。
完整修复代码
先加载依赖包并读取数据(假设你已经从WorldClim下载好栅格文件):
library(ggplot2) library(raster) library(sf) # 读取WorldClim栅格数据(以年平均气温为例) temp_raster <- raster("wc2.1_30s_bio_1.tif") # 转换为ggplot可用的数据框格式 temp_df <- as.data.frame(temp_raster, xy = TRUE) colnames(temp_df) <- c("lon", "lat", "temp")
绘图核心代码:
ggplot(temp_df, aes(x = lon, y = lat, fill = temp)) + geom_raster() + # 强制设置WGS84(4326)投影 coord_sf(crs = st_crs(4326)) + # 自定义x轴:指定刻度断点+添加E/W方位标签 scale_x_continuous( breaks = seq(-180, 180, by = 60), # 按60°间隔设置刻度 labels = function(x) { ifelse(x >= 0, paste0(x, "°E"), paste0(abs(x), "°W")) } ) + # 自定义y轴:指定刻度断点+添加N/S方位标签 scale_y_continuous( breaks = seq(-90, 90, by = 30), # 按30°间隔设置刻度 labels = function(x) { ifelse(x >= 0, paste0(x, "°N"), paste0(abs(x), "°S")) } ) + labs(x = "经度", y = "纬度", fill = "年平均气温(℃)") + theme_minimal()
关键说明
- 手动设置
breaks参数:直接定义刻度的位置,避免ggplot2在投影模式下自动简化刻度 - 匿名函数自定义标签:根据经纬度的正负判断方位,自动拼接°E/°W、°N/°S符号
- 同时处理x、y轴:确保投影规则和刻度逻辑一致,不会出现单轴异常的情况
如果你的数据是sf格式矢量文件,只需要把geom_raster()换成geom_sf(),其余刻度和投影设置完全通用。
内容的提问来源于stack exchange,提问作者Tao Hu
相关产品推荐
相关产品推荐

