如何在R语言image.plot空间图中添加阴影区域与散点
在R语言image.plot绘制的空间分布图中添加棕色调阴影区域和散点组
我目前用R语言的image.plot函数绘制空间分布图,想在现有图里加上类似示例图的棕色调阴影区域以及散点组。以下是我的现有绘图代码,可提供采样数据,求实现方法。
library(ncdf4) library(chron) library(lattice) library(RColorBrewer) library(fields) # image.plot library(maps) # map (to add country borders to map) library(RColorBrewer) seas <- c("djf","jja","mam","son") SEA <- c("DJF","JJA","MAM","SON", "DJF","JJA","MAM","SON", "DJF","JJA","MAM","SON", "DJF","JJA","MAM","SON", "DJF","JJA","MAM","SON") # proj <- "rcp26" proj <- "rcp85" # period <- "2021-2050" period <- "2070-2099" param <- "tas" #data dir path <- paste("E:/plot/RCM/",proj,"/",param,"/",sep="") setwd(dir=path) file_all <- list.files(pattern=glob2rx("*70*.nc")) # model_name <- c("CNRM-ALADIN63","ECEARTH-CCLM","HADGEM-HIRHAM", # "MPI-RACMO","NORESM-REMO") model_name <- c("CNRM-ALADIN63","CNRM-ALADIN63","CNRM-ALADIN63", "CNRM-ALADIN63","ECEARTH-CCLM","ECEARTH-CCLM", "ECEARTH-CCLM","ECEARTH-CCLM","HADGEM-HIRHAM","HADGEM-HIRHAM", "HADGEM-HIRHAM","HADGEM-HIRHAM","MPI-RACMO","MPI-RACMO", "MPI-RACMO","MPI-RACMO","NORESM-REMO","NORESM-REMO", "NORESM-REMO","NORESM-REMO") for (fileno in 1:length(file_all)) { ncint <- nc_open(file_all[fileno]) # Lonlat time --------------------------------- # get longitude and latitude lon <- ncvar_get(ncint,"lon") lat <- ncvar_get(ncint,"lat") time <- ncvar_get(ncint,"time") # Edit Variable --------------------------------- #Define Variables tas_array <- ncvar_get(ncint,varid=param) # Data show --------------------------------- tas_slice <- (tas_array) # range(tas_slice,na.rm=T) # Plot section --------------------------------- # brks <- seq(-5,5,0.5) #tas # brks <- seq(-8,8,1) #tasmin brks <- seq(0,10,1) #tasmax # brks <- seq(-4,12,1) #asymetric # length(brks) colorscale <- colorRampPalette(brewer.pal(11, "OrRd"))(length(brks)-1) # colorscale <- rev(colorRampPalette(brewer.pal(11, "RdBu"),bias=0.41)(length(brks)-1)) # Saving Figures fig<- paste("E:/plot/RCM/",proj,"/figures/",param,"/change-",param,"-",proj,"-",period,"-", SEA[fileno],"-",model_name[fileno],".png",sep="") jpeg(file=fig,units="in", width=18, height=10, res=300) # windows() image.plot(lon,lat,tas_slice, col=colorscale,breaks=brks,lab.breaks=brks, xaxt="n", yaxt="n", ann=FALSE,horizontal=F) map(database="world", add=TRUE) # we create customized axes (e.g., labels are added to every 20th degrees) axis(side=1, at=seq(-180,177.5,10), labels=seq(-180,177.5,10)) axis(side=2, at=seq(-80,80,10), labels=seq(-80,80,10), las=3) # we add longitudes and latitudes to the map # abline(h=seq(-80,80,10), v=seq(-180,177.5,10), lty=2) title(main=paste(SEA[fileno],proj,param,model_name[fileno],period, sep=" "), line=2,cex.lab=1, cex.axis=1.5, cex.main=2, cex.sub=1.5) mtext("degC ", side=4, line=5,cex=1.5) graphics.off() }
实现方法
一、添加棕色调阴影区域
棕色调阴影通常用来标记特定研究区域,用polygon()函数即可实现:
- 先准备目标区域的经纬度边界坐标(可以是简单多边形或复杂的地理边界)
- 在绘图流程中调用
polygon(),通过adjustcolor()设置半透明棕色调,避免遮挡底层的空间分布数据
示例代码片段:
# 替换为你的目标区域实际经纬度坐标 shadow_lon <- c(100, 120, 120, 100) shadow_lat <- c(20, 20, 40, 40) # 绘制半透明棕褐色阴影,alpha.f控制透明度(0完全透明,1不透明) polygon(shadow_lon, shadow_lat, col = adjustcolor("saddlebrown", alpha.f = 0.3), border = NA)
如果需要标记复杂地理区域(比如国家、流域),可以用maps包提取对应区域的坐标,或者用sf包读取矢量边界文件后转换格式绘制。
二、添加散点组
散点用来标记采样点或站点,用points()函数实现:
- 准备散点的经纬度数据
- 设置点的形状(
pch)、颜色(col)、大小(cex)等参数区分不同组别
示例代码片段:
# 替换为你的实际采样点数据 scatter_data <- data.frame( lon = c(105, 110, 115), lat = c(25, 30, 35) ) # 绘制黑色实心散点,大小为2 points(scatter_data$lon, scatter_data$lat, pch = 19, col = "black", cex = 2) # 若需区分多组,可设置不同样式: # points(scatter_data$lon[1:2], scatter_data$lat[1:2], pch = 17, col = "red", cex = 2)
整合到现有代码
将上述代码插入到绘图循环中,位置在image.plot()之后:
- 若想阴影在地图图层下方,放在
map()之前;若想阴影覆盖在地图上,放在map()之后 - 散点一般放在最后绘制,避免被其他图层遮挡
修改后的绘图部分代码:
jpeg(file=fig,units="in", width=18, height=10, res=300) image.plot(lon,lat,tas_slice, col=colorscale,breaks=brks,lab.breaks=brks, xaxt="n", yaxt="n", ann=FALSE,horizontal=F) # 1. 添加棕色调阴影区域 shadow_lon <- c(100, 120, 120, 100) shadow_lat <- c(20, 20, 40, 40) polygon(shadow_lon, shadow_lat, col = adjustcolor("saddlebrown", alpha.f = 0.3), border = NA) map(database="world", add=TRUE) # 2. 添加散点组 scatter_data <- data.frame( lon = c(105, 110, 115), lat = c(25, 30, 35) ) points(scatter_data$lon, scatter_data$lat, pch = 19, col = "black", cex = 2) # 后续轴、标题设置保持不变 axis(side=1, at=seq(-180,177.5,10), labels=seq(-180,177.5,10)) axis(side=2, at=seq(-80,80,10), labels=seq(-80,80,10), las=3) title(main=paste(SEA[fileno],proj,param,model_name[fileno],period, sep=" "), line=2,cex.lab=1, cex.axis=1.5, cex.main=2, cex.sub=1.5) mtext("degC ", side=4, line=5,cex=1.5) graphics.off()
注意事项
- 必须替换示例中的阴影坐标和散点数据为你的实际目标数据
- 调整
alpha.f参数可以控制阴影的透明度,数值越小越透明 - 散点的
pch参数支持多种形状,比如19是实心圆、17是实心三角 - 如果是多个不连通的阴影区域,可循环调用
polygon()逐个绘制
内容的提问来源于stack exchange,提问作者kettaren ray
相关产品推荐
相关产品推荐

