我试图用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()
即使设置了par(mar=c(1,1,1,1)
,您也可以看到同一行上的两个图形之间没有分离。
如果我添加设置axes=TRUE
to 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()
知道如何在不写入轴的情况下获取带间距的第一个图形或第二个图形吗?
更新于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(原始答案):
迟到总比没有好:可以通过将图形参数xaxt
和yaxt
设置为"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()
这是结果:
如果问题是错误,它实际上应该作为报告提交给包的错误跟踪器。无论如何,这种解决方法应该足以满足上述目的。
我终于发现了一种破解(有点)修复它。它不太理想,但我认为这是函数中的一个错误,所以没有其他方法可以绕过它而不重写函数。
我修复的想法是使光栅的范围内的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()
它可以工作,但如果你想添加legend
或其他类似的东西,它可能会导致问题。