使用绘图(...,add = T)叠加栅格图会导致最终绘图的任意错位

Luc*_*ini 10 plot r raster

我发现当我尝试使用绘图(...,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)

the*_*kua 5

我也遇到了这个问题,并通过调用图形参数函数 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)

  • 谢谢。我之前就遇到过这个问题,并尝试了一切方法来解决它。上面“the_skua”提供的答案有效!这有点老套,但足以让我们继续前进。请务必从后续的“plot(raster)”函数调用中删除“add=TRUE”参数。另外,对于每个“par()”函数,请务必设置“new=TRUE”,第一个函数除外。 (2认同)

Jos*_*ien 3

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)

在此输入图像描述

  • 同意。这绝对是一个错误。有一天,如果没有其他人解决这个问题,我计划解决。这将是低级别的东西,我的猜测是它与一些优化有关,旨在允许绘图设备不必“记住”有关在其上绘制的一层又一层的所有内容。不知何故,在这一步中,相关元信息的一部分并没有完全正确地传递:应该相对于整个设备表示的坐标是相对于 `par("mar")` 或 `par("omar" )`,或者……类似的东西。(只是一种预感,但有几件事表明了这一点。) (3认同)