我正在尝试使用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
添加到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()
任何想法如何获得第一个带间距的图形或第二个图形没有写入轴?
答案 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(原始答案):
迟到总比不到好:
通过将图形参数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()
这是结果:
如果问题是错误,则实际上应将其作为报告提交给软件包的错误跟踪器。无论如何,此替代方法应足以满足上述目的。
答案 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()
它可以工作,但如果你想添加legend
或其他类似的东西,它可能会导致问题。