如何在 R 中保存与输入 tiff 尺寸完全相同的 tiff 背景图像

How do I save a tiff background image in R with exactly the same dimensions as my input tiff

我正在使用 ggplot 在 R 中添加背景图像。我在迭代过程中这样做,构建具有相同背景的多张幻灯片。

我有一个 tiff 格式的输入世界地图,我将它读入一个 ggmap 进程,然后将它写成一个 tiff 文件。

world map with urban areas highlighted

我有两个问题需要帮助: 1. 保存的世界地图图片与输入文件相比稍微偏右下写。仔细看看这个。 2.保存的文件丢失分辨率。

world_background <-tiff::readTIFF("world_background_in.tiff", native = TRUE)
myplt <- ggplot() +
    theme_void() + theme(legend.position="none") +
    annotation_custom(rasterGrob(world_background, 
                                 width = unit(1,"npc"), 
                                 height = unit(1,"npc")), 
                      -Inf, Inf, -Inf, Inf) +
    scale_x_continuous(limits = c(-180, 180)) +
    scale_y_continuous(limits = c(-79.99688, 79.99825))
tiff("world_packground_out.tiff", width=1024, height=580, res=300, compression = "lzw")
print(myplt)
dev.off()

如果您 运行 在迭代的基础上使用保存的文件作为下一次迭代的输入,您将看到世界图片为您生成的每个输出向下和向右滑动,并且分辨率变为颗粒感越来越强。

关于将图像保持在完全相同的位置有什么建议吗?我如何保持我的决心?

注意:上传的图片以png格式保存(我想!)。如果你运行我的代码用png输入,问题是一样的

不确定您遇到的问题是什么,评论中 post 的回复太长,因此有一个答案。

我正在使用 magick::image_read() 阅读背景图片。由于我不知道您要绘制什么,因此我使用 mtcars 作为示例数据集来检查它是否在循环中工作 - 要绘制的变量和 scale_y_continuous 都是相关的在正在绘制的列上,这可能与您的用例相似。

lapply(c('data.table', 'ggplot2', 'grid', 'png', 'magick'), 
       library, character.only = T)

img <- image_read('https://i.stack.imgur.com/IwjyT.png')
dat <- as.data.table(mtcars)
plot_list <- lapply(colnames(dat)[1:5], function(z){
  plt <- ggplot(dat, aes_string(x = 'wt', y = z)) + 
    theme(legend.position = 'none') + 
    annotation_custom(grob = rasterGrob(image = img, 
                                        width = unit(1, 'npc'), 
                                        height = unit(1, 'npc')), 
                      xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) + 
    geom_point() + geom_line() + 
    scale_x_continuous(limits = dat[, range(wt)]) + 
    scale_y_continuous(limits = dat[, range(get(z))])

  ggsave(filename = sprintf('%s vs Wt.png', z), plot = plt, device = 'png')

  return(plt)

})

我发现绘图没有问题 - 通过在本地保存绘图来确认。唯一一次图像大小有差异是当 y 轴的刻度线有更多数字时(例如,绘制 cyl 与绘制 hp 时)。

我也用 theme_void 测试了这个 - 它只删除了 x, y 轴并且对绘图本身没有影响。

更新:

我将 "saving" 功能从 "tiff + print" 保存更改为 "ggsave" 保存。

@gautam 的回答给了我方向

另外我发现了这个 enter link description here

代码现在看起来像这样

world_background <-tiff::readTIFF("world_background_in.tiff", native = TRUE)
myplt <- ggplot() +
    theme_void() + theme(legend.position="none") +
    annotation_custom(rasterGrob(world_background, 
                                 width = unit(1,"npc"), 
                                 height = unit(1,"npc")), 
                      -Inf, Inf, -Inf, Inf) +
    scale_x_continuous(limits = c(-180, 180)) +
    scale_y_continuous(limits = c(-79.99688, 79.99825))
ggsave("world_packground_out.tiff", width=10.4, height=5.89, dpi=600, units="in", compression = "lzw")
#print(myplt)
#dev.off()