Как сохранить фоновое изображение TIFF в R с точно такими же размерами, как мой входной TIFF - PullRequest
0 голосов
/ 05 апреля 2020

Я добавляю фоновое изображение в R, используя ggplot. Я делаю это в итеративном процессе, создавая несколько слайдов с одним и тем же фоном.

У меня есть входная карта мира в формате TIFF, я считываю ее в процесс ggmap, а затем записываю в виде файла TIFF.

карта мира с выделенными городскими районами

У меня есть две проблемы, с которыми мне нужна помощь: 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()

Если вы запустите его итеративно, используя сохраненный файл в качестве входных данных для следующей итерации, вы увидите, что мир pi c скользит вниз и право на каждый вывод, который вы производите, и разрешение становится все более зернистым.

Есть какие-либо предложения по сохранению изображения в том же месте? И как мне сохранить разрешение?

Примечание. Загруженное изображение сохраняется в формате png (я думаю!). Если вы запустите мой код с помощью ввода png, проблема будет та же

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Обновление:

Я изменил свою функцию сохранения с сохранения "tiff + print" на сохранение "ggsave".

Ответ, предоставленный @gautam, дал мне направление

Плюс я нашел это введите описание ссылки здесь

Код теперь выглядит так

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()

0 голосов
/ 05 апреля 2020

Не уверен, с какой проблемой вы столкнулись, ответ был слишком длинным, чтобы оставить комментарий, следовательно, ответ.

Я использую magick::image_read() для чтения фонового изображения. Поскольку я не знаю, что вы пытаетесь построить, я использую mtcars в качестве примера набора данных, чтобы проверить, работает ли он в al oop - и переменная, которая должна быть построена, и 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)

})

Я не обнаружил проблем с графиками - это подтверждается сохранением графика локально. Разница в размере изображения была единственной, когда на оси у было больше цифр для отметок (например, при построении cyl против при построении hp).

Я также проверил это с theme_void - он только удалил оси x, y и не изменил сам график.

...