如何用rasterVis包将显著性栅格以点标记叠加至趋势栅格
栅格可视化:rasterVis结合显著性标记的解决方案
问题描述
我有两类栅格图像:趋势栅格(Trend Raster)和显著性栅格(Significant Raster),想要把显著性栅格以点标记的形式叠加在趋势栅格上,同时展示两者的结果。尝试用ggplot绘制时效果很差——用"+"标记会铺满地图,而且代码运行极慢(推测是fill=value导致的),急需快速绘图的方案。
了解到rasterVis包的levelplot函数适合这类需求,但有几个困惑:
- 如何用"+"形状清晰绘制显著性标记?
- 怎么去除绘图背景的灰色?
- 能否结合rasterVis和其他工具实现这个可视化?
当前使用的ggplot代码如下:
P<-raster(file.choose()) P[P>=0.05]<-NA test_P <- as(P, "SpatialPixelsDataFrame") test_P <- as.data.frame(test_P) Trend111<- raster(file.choose()) test_trend111 <- as(Trend111, "SpatialPixelsDataFrame") test_trend111 <- as.data.frame(test_trend111) colnames(test_trend111) <- c("value", "x", "y") ggplot() +geom_raster(data = test_trend111,aes(x=x,y=y,fill=value))+ scale_fill_gradient("Trend2",low = 'yellow', high = 'green',na.value = NA)+ geom_point(data=test_P,aes(x = x, y = y),shape=".",na.value = NA)#,alpha = 0.05,size=2,stroke=0)
解决方案
1. 用rasterVis实现"+"形状的显著性标记
rasterVis的levelplot可以结合layer函数快速叠加显著性点。先把显著性栅格转换为仅包含有效像素的空间点数据,再用sp.points绘制"+"标记:
library(rasterVis) library(sp) # 读取并预处理栅格 Trend <- raster(file.choose()) P <- raster(file.choose()) P[P >= 0.05] <- NA # 仅保留显著性符合要求的像素 # 提取显著性栅格中的非NA像素为空间点 sig_points <- rasterToPoints(P, spatial = TRUE) # 绘制趋势栅格并叠加"+"标记 levelplot(Trend, main = "趋势与显著性结果", col.regions = colorRampPalette(c("yellow", "green"))) + layer(sp.points(sig_points, pch = 3, col = "black", cex = 0.5))
pch=3对应"+"形状,cex控制标记大小(避免铺满地图),col设置标记颜色与趋势栅格形成对比。
2. 去除背景灰色
通过rasterTheme(rasterVis专属主题函数)直接修改背景样式,一步去除灰色:
# 无灰色背景的完整绘图代码 levelplot(Trend, main = "趋势与显著性结果", col.regions = colorRampPalette(c("yellow", "green")), par.settings = rasterTheme(background = "white", axis.line = list(col = NA))) + layer(sp.points(sig_points, pch = 3, col = "black", cex = 0.5))
background="white"将灰色背景替换为白色,也可设为"transparent"实现透明背景;axis.line = list(col = NA)可隐藏坐标轴边框。
3. 结合rasterVis与其他工具的方案
如果需要更灵活的样式,可结合以下两种方式:
- 与lattice结合:利用lattice的
panel函数自定义图例、坐标轴等元素,拓展绘图功能; - 与ggplot配合(优化速度版):若坚持用ggplot,不要将栅格转为data.frame,直接基于栅格对象绘图,同时仅提取显著性栅格的非NA点:
library(ggplot2) # 优化后的ggplot代码(提升速度) ggplot() + geom_raster(data = Trend, aes(x = x, y = y, fill = value)) + scale_fill_gradient("Trend", low = "yellow", high = "green", na.value = NA) + geom_point(data = as.data.frame(sig_points), aes(x = x, y = y), pch = 3, col = "black", size = 0.5) + theme_void() # 去除冗余背景和坐标轴,降低绘图负载
注:rasterVis的
levelplot处理大栅格时速度远快于ggplot,因为它直接基于栅格对象操作,无需转换为data.frame。
内容的提问来源于stack exchange,提问作者shuaige C
相关产品推荐
相关产品推荐

