如何在R语言的levelplot上叠加海岸线及国界线地图?
在Lattice的Levelplot上叠加指定区域的海岸线和国界线
你可以通过以下步骤实现需求,既保留原有的色彩填充效果,又只在目标经纬度范围(北纬31°-37°、东经31°-34°)显示海岸线和国界线:
1. 准备额外依赖包
首先需要加载maps包(或更精细的mapdata包)来获取海岸线与国界线数据,同时保留你原有的lattice和ncdf4包:
library(lattice) library(ncdf4) library(maps) # 基础地图数据,若需要更精细的海岸线可改用library(mapdata)
2. 读取并处理原始数据
这部分沿用你已有的代码,同时提前定义目标区域的经纬度范围,方便后续统一使用:
# 读取NC数据 ncin <- nc_open("testplot.nc") tp <- ncvar_get(ncin,"tp") lon <- ncvar_get(ncin,"longitude") lat <- ncvar_get(ncin,"latitude") nc_close(ncin) # 记得关闭NC文件,避免资源占用 # 构造网格数据 grid <- expand.grid(lon=lon, lat=lat) # 定义目标区域范围 target_xlim <- c(31, 34) # 东经31°-34° target_ylim <- c(31, 37) # 北纬31°-37°
3. 绘制基础Levelplot并限定范围
在levelplot中通过xlim和ylim参数直接限定绘图区域,确保主图只展示你需要的范围:
p <- levelplot(tp ~ lon * lat, data=grid, xlim = target_xlim, ylim = target_ylim, main = "降水数据叠加指定区域海岸线")
4. 叠加裁剪后的海岸线与国界线
使用lattice的layer()函数,结合map()获取并筛选目标区域内的地图数据,然后叠加到基础图上:
# 叠加海岸线 p <- p + layer({ # 获取全球海岸线数据并裁剪到目标范围 coast_map <- map("world", plot = FALSE, xlim = target_xlim, ylim = target_ylim) lines(coast_map$x, coast_map$y, col = "black", lwd = 1) # 若需要单独叠加国界线,可额外添加以下代码 # border_map <- map("world", regions = ".", plot = FALSE, xlim = target_xlim, ylim = target_ylim) # lines(border_map$x, border_map$y, col = "darkgrey", lwd = 0.8) }) # 展示最终图形 print(p)
关键说明:
map("world", plot=FALSE)会返回地图的坐标数据而不直接绘图,方便我们筛选和裁剪到指定范围lines()函数用于在已有的levelplot图层上绘制线条,你可以通过col和lwd参数调整线条的颜色和粗细- 如果需要更精细的海岸线数据,把
map("world")替换成map("worldHires", plot=FALSE)(需要先加载mapdata包)
内容的提问来源于stack exchange,提问作者AlexLee
相关产品推荐
相关产品推荐

