如何在 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()
我正在使用 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()