为plotRGB图添加边距

时间:2017-06-27 12:41:10

标签: r r-raster

我正在尝试使用raster::plotRGB绘制6个rgb图像,我在调整边距时遇到问题。默认情况下,plotRGB会覆盖我们之前调用的每个par(mar)设置。我的目标是拥有一个3 * 2对称图表面板。

library(raster)
par.default <- par(no.readonly=T)

png("c:\\temp\\img_plotRGB.png", width=6, height=9,unit="in", res=300)
par(mfrow=c(3,2), oma=c(1,1,1,1), mar=c(1,1,1,1))
for(i in 1:6){
  r <- g <- b <- raster(ncol=10, nrow=10, res=1, crs=CRS("+init=EPSG:32198"), ext=extent(c(0,10,0,10)))
  values(r) <- runif(ncell(r))
  values(g) <- runif(ncell(r))
  values(b) <- runif(ncell(r))
  rgb = rgb<-stack(r*255,g*255,b*255)
  plotRGB(rgb)
}
par(par.default)
dev.off()

给出:enter image description here

即使设置了par(mar=c(1,1,1,1),您也可以看到同一行上的两个图表之间没有分离。

如果我将设置axes=TRUE添加到plotRGB,我会得到我想要的布局,但是我想要的是轴:

png("c:\\temp\\img_plotRGB_axes.png", width=6, height=9,unit="in", res=300)
par(mfrow=c(3,2), oma=c(1,1,1,1), mar=c(1,1,1,1))
for(i in 1:6){
  r <- g <- b <- raster(ncol=10, nrow=10, res=1, crs=CRS("+init=EPSG:32198"), ext=extent(c(0,10,0,10)))
  values(r) <- runif(ncell(r))
  values(g) <- runif(ncell(r))
  values(b) <- runif(ncell(r))
  rgb = rgb<-stack(r*255,g*255,b*255)
  plotRGB(rgb, axes=TRUE)
}
par(par.default)
dev.off()

enter image description here

任何想法如何获得第一个带间距的图形或第二个图形没有写入轴?

2 个答案:

答案 0 :(得分:2)

2019年5月11日更新: 程序包开发人员现已解决此问题,请参阅: https://github.com/rspatial/raster/issues/48

因此,从光栅包版本> = 2.9-3 开始,自定义页边距将在绘图时添加参数magins=TRUE(即plotRGB(rgb, margins=TRUE))时按预期工作。

请注意,在将更新推送到CRAN存储库上的软件包的稳定版本之前,您将必须从GitHub安装当前开发版本,方法是下载源代码,或者更合理地使用devtools软件包,以便:

library(devtools)
install_github("rspatial/raster")

对于光栅包版本<2.9-3(原始答案)

迟到总比不到好: 通过将图形参数xaxtyaxt设置为"n",可以抑制绘制坐标轴(有关R文档,请参见?par

因此,有可能在plotRGB中使用axes=TRUE的副作用,以便在不实际绘制轴的情况下使用(某些)图形参数。如下所示:

library(raster)
par.default <- par(no.readonly=T)
png("img_plotRGB.png", width=6, height=9,unit="in", res=300)

library(raster)
par(mfrow=c(3,2),mar=rep(1,4),oma=rep(1,4), xaxt="n", yaxt="n")
for(i in 1:6){
  r <- g <- b <- raster(ncol=10, nrow=10, res=1, ext=extent(c(0,10,0,10)))
  values(r) <- runif(ncell(r))
  values(g) <- runif(ncell(r))
  values(b) <- runif(ncell(r))
  rgb = rgb<-stack(r*255,g*255,b*255)
  plotRGB(rgb, axes=TRUE)
}

par(par.default)
dev.off()

这是结果:

enter image description here

如果问题是错误,则实际上应将其作为报告提交给软件包的错误跟踪器。无论如何,此替代方法应足以满足上述目的。

答案 1 :(得分:0)

我终于找到了一种修复它的方法。它不太理想,但我认为这是函数中的一个错误,所以没有其他方法可以绕过它而不重写函数。

我的修复方法是在光栅范围内制作SpatialPolygons,使用不同宽度的边框制作plot两次:

png("c:\\temp\\img_plotRGB_border.png", width=6, height=9,unit="in", res=300)
par(mfrow=c(3,2), oma=c(0,0,0,0), mar=c(0,0,0,0))
for(i in 1:6){
  r <- g <- b <- raster(ncol=10, nrow=10, res=1, crs=CRS("+init=EPSG:32198"), ext=extent(c(0,10,0,10)))
  values(r) <- runif(ncell(r))
  values(g) <- runif(ncell(r))
  values(b) <- runif(ncell(r))
  rgb = rgb<-stack(r*255,g*255,b*255)
  plotRGB(rgb)

###  New lines!
  plot(as(extent(c(0,10,0,10)),"SpatialPolygons"),border="black", lwd=8, add=T)
  plot(as(extent(c(0,10,0,10)),"SpatialPolygons"),border="white", lwd=4, add=T)
###  New lines!
}
par(par.default)
dev.off()

enter image description here

它可以工作,但如果你想添加legend或其他类似的东西,它可能会导致问题。