导出terra绘图为PNG时缩减边距的技术咨询
问题描述
我想用terra包绘制rast栅格图并将其连同图例导出为PNG格式,要求导出的图像能紧密贴合绘图区域。但用png()默认导出时,生成的图像存在较宽的多余边距。另外,因为要计算的区域包含图例,无法直接通过栅格的宽高比推导合适的导出比例。我当前使用的是terra开发版本1.8-36,以下是最小可复现代码及标注了左侧多余边距的示例图:
library(terra) r <- rast(system.file("ex/elev.tif", package="terra")) x <- scale_linear(r, 0, 30) bks <- c(0,0.4,0.8,1.3,2,4,8,15,30) colors <- c('#3182BD', '#9ECAE1', '#DEEBF7', '#FEE5D9', '#FCAE91', '#FB6A4A', '#DE2D26', '#A50F15') png("file_name.png", type="cairo-png") plot(x, col=colors, box=F, axes=F, breaks=bks, reverse=TRUE, plg=list( title = "Title", title.cex = 1.2, cex = 1.2 )) dev.off()

解决方案
可以通过以下几种方法解决边距问题:
方法1:用
par()强制清除边距
在绘图前设置所有边距为0,直接消除默认的空白区域。修改后的代码如下:library(terra) r <- rast(system.file("ex/elev.tif", package="terra")) x <- scale_linear(r, 0, 30) bks <- c(0,0.4,0.8,1.3,2,4,8,15,30) colors <- c('#3182BD', '#9ECAE1', '#DEEBF7', '#FEE5D9', '#FCAE91', '#FB6A4A', '#DE2D26', '#A50F15') png("file_name.png", type="cairo-png") par(mar = c(0, 0, 0, 0)) # 把上下左右边距全设为0 plot(x, col=colors, box=F, axes=F, breaks=bks, reverse=TRUE, plg=list( title = "Title", title.cex = 1.2, cex = 1.2 )) dev.off()方法2:精确控制图例位置
通过plg参数的x、y和mar属性,把图例固定在指定位置并缩小自身边距,避免占用多余空间:plg=list( title = "Title", title.cex = 1.2, cex = 1.2, x = "right", y = "center", mar = 0 # 取消图例自身的内部边距 )方法3:改用ggplot2绘图(可选)
如果需要更灵活的布局控制,可以将栅格转为数据框后用ggplot2绘制,通过theme()完全清除边距:library(ggplot2) library(terra) r <- rast(system.file("ex/elev.tif", package="terra")) x <- scale_linear(r, 0, 30) df <- as.data.frame(x, xy = TRUE) bks <- c(0,0.4,0.8,1.3,2,4,8,15,30) colors <- c('#3182BD', '#9ECAE1', '#DEEBF7', '#FEE5D9', '#FCAE91', '#FB6A4A', '#DE2D26', '#A50F15') ggplot(df, aes(x = x, y = y, fill = elev)) + geom_raster() + scale_fill_gradientn(colors = colors, breaks = bks, limits = c(0,30)) + theme_void() + # 清空所有边框、坐标轴元素 theme(legend.position = "right", plot.margin = margin(0,0,0,0, "cm")) + # 设绘图区域边距为0 labs(fill = "Title") + guides(fill = guide_colorbar(title.position = "top", title.size = 12, label.size = 12)) ggsave("file_name.png", type = "cairo-png", bg = "white")
内容的提问来源于stack exchange,提问作者Laura Roich
相关产品推荐
相关产品推荐

