为plotRGB图添加边距

问题描述 投票:1回答:2

我试图用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=TRUEto 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

知道如何在不写入轴的情况下获取带间距的第一个图形或第二个图形吗?

r r-raster
2个回答
2
投票

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

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

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

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

如果问题是错误,它实际上应该作为报告提交给包的错误跟踪器。无论如何,这种解决方法应该足以满足上述目的。


0
投票

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

我修复的想法是使光栅的范围内的SpatialPolygonsplot两次使用不同的宽度边框:

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或其他类似的东西,它可能会导致问题。

© www.soinside.com 2019 - 2024. All rights reserved.