我发现当我尝试使用绘图(...,add = T)覆盖多个栅格时,如果我尝试将多于3个栅格叠加在一起,则后续绘图不会正确对齐栅格.
我最初的意图是创建一个模拟的土地覆盖的分类地图,其中代表封面类的颜色的黑暗与我们的模型投影中的确定性不同.为此,我创建了一个简单的脚本,它将遍历每个封面类并使用从灰色(低确定性森林预测)到全覆盖颜色(例如,深绿色)的颜色渐变来绘制它(例如,森林,地图上的绿色)对于强烈预测的区域).我发现使用这种方法,在第3个封面添加到绘图之后,所有后续覆盖在绘图上的栅格都是任意错位的.我已经颠倒了封面类的绘图顺序,并且表现出相同的行为,这意味着它不是个别封面类栅格的问题.在Rstudio中更令人费解的是,当我使用变焦按钮仔细检查最终情节时,错位会恶化.
你对这种行为存在的原因有什么看法吗?最重要的是,您有任何建议的解决方案或解决方法吗?
下面链接中的代码和数据具有捕获的所有描述的行为. https://dl.dropboxusercontent.com/u/332961/r%20plot%20raster%20add%20issue.zip 转动plot_gradient = F看看你如何只是简单地将同一个栅格子集化并按顺序将子集添加到同一个图中可以复制这个问题.我已经尝试设置绘图设备图的范围(...,ext),但这不起作用.我也检查了每个封面光栅的范围是一样的.
下面是未对齐的封面类的图.绘制到jpeg设备将导致类似的图像(即,这不是Rstudio渲染的问题).
奇怪的是,如果我使用Rstudio放大图像,则不对齐是不同的
相比之下,这就是封面应该如何在景观中正确对齐

library(raster)
library(colorRamps)
raster_of_classes=raster("C:/r plot raster add issue/raster_of_classes.tif")
raster_of_certainty_of_classes=raster("C:/r plot raster add issue/raster_of_certainty_of_classes.tif")
endCols=c("darkorchid4", "darkorange3", "red3", "green4", "dodgerblue4") #colors to be used in gradients for each class
classes=unique(raster_of_classes)
minVal=cellStats(raster_of_certainty_of_classes, min)
tmp_i=1
addPlot=F
plot_gradient=F #this is for debug only
#classes=rev(classes) #turn this off and on to see how last 2 classes are mis aligned, regardless of plotting order
for (class in classes){
raster_class=raster_of_classes==class #create mask for individual class
raster_class[raster_class==0]=NA #remove 0s from mask so they to do not get plotted
if (plot_gradient){
raster_of_certainty_of_class=raster_of_certainty_of_classes*raster_class #apply class mask to certainty map
}else{
raster_of_certainty_of_class=raster_class #apply class mask to certainty map
}
endCol=endCols[tmp_i] #pick color for gradient
col5 <- colorRampPalette(c('grey50', endCol))
if (plot_gradient){
plot(raster_of_certainty_of_class,
col=col5(n=49), breaks=seq(minVal,1,length.out=50), #as uncertainty values range from 0 to 1 plot them with fixed range
useRaster=T, axes=FALSE, box=FALSE, add=addPlot, legend=F)
}else{
plot(raster_of_certainty_of_class,
col=endCol,
useRaster=T, axes=FALSE, box=FALSE, add=addPlot, legend=F)
}
tmp_i=tmp_i+1
addPlot=T #after plotting first class, all other classes are added
}
Run Code Online (Sandbox Code Playgroud)
我也遇到了这个问题,并通过调用图形参数函数 par() 和参数子集来解决它,最重要的new=TRUE是,在每个附加 plot() 之前,将 放入par() 调用中,而不是 plot() 调用中) 称呼。例如:
png(fullname,
width = 3000,
height= 3000)
# original par() call
par(mfrow=c(1,1), cex=3, mar=c(3,3,3,7), bg=bgcol, col=txtcol)
# first plot
plot(zreate,
maxpixels=ncell(zreate),
col=qcol,
colNA=mapbg,
xaxt='n',
yaxt='n',
ext=map_extent,
breaks=tq,
bty='n',
legend=FALSE)
#second plot and par() call
par(mfrow=c(1,1), cex=3, mar=c(3,3,3,7), bg=bgcol, col=txtcol, new=TRUE)
plot(rt,
maxpixels=ncell(rt),
col=dcol,
legend=FALSE,
xaxt='n',
yaxt='n',
ext=map_extent,
bty='n')
#third plot and par() call
par(mfrow=c(1,1), cex=3, mar=c(3,3,3,7), bg=bgcol, col=txtcol, new=TRUE)
plot(r0,
maxpixels=ncell(r0),
col="#9e9ac8",
xaxt='n',
yaxt='n',
ext=map_extent, #PRENAFILTERING fix
bty='n',
legend=FALSE)
Run Code Online (Sandbox Code Playgroud)
2013 年 12 月,我向 R-sig-geo 邮件列表发布了一个关于此行为的问题,但没有得到任何有用的回复(除了确认 R 版本和操作系统与我自己的版本不同时也会发生这种情况)。
作为记录,这里是我用来说明该问题的可重现示例。(有关更多解释,请参阅链接的问题。)
library(maptools) ## Only needs to be installed for example data
library(raster)
library(rgeos)
## Create an example raster
p <- shapefile(system.file("shapes/co37_d90.shp", package="maptools"))
p <- p[31,] ## A tall narrow county polygon
pr <- gDifference(gBuffer(p, width=.01), p)
r <- rasterize(pr, raster(extent(pr), ncol=100, nrow=100))
## These three are properly registered on one another
plot(r, col="yellow", legend=FALSE)
plot(r, col="green", legend=FALSE, add=TRUE)
plot(r, col="grey", legend=FALSE, add=TRUE)
## All subsequent "layers" are improperly shifted/skewed to right
plot(r, col="yellow", legend=FALSE, add=TRUE)
plot(r, col="blue", legend=FALSE, add=TRUE)
plot(r, col="red", legend=FALSE, add=TRUE)
plot(r, col="grey20", legend=FALSE, add=TRUE)
## Following the above, SpatialPolygons are also shifted/skewed
plot(p, border="red", lwd=2, add=TRUE)
Run Code Online (Sandbox Code Playgroud)
