Построение 3 карт в 2 строки с использованием пакета R tmap - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь сохранить график, используя 3 карты, сделанные в пакете tmap, с большей картой вверху и двумя другими внизу, как в примере выше: enter image description here

Но, используя tmap_arrange(), предоставляемый пакетом для такого рода процедур, он дает мне следующее:

data(World)
p1 <- tm_shape(World)+tm_polygons()
p2 <- tm_shape(World[World$continent=='South America',])+tm_polygons()
p3 <- tm_shape(World[World$name=='Brazil',])+tm_polygons()

tmap_arrange(p1,p2,p3,nrow=2)

enter image description here

Я попытался использовать много опций, таких как экспорт карт в виде изображений и затем снова импортировать их в R, чтобы создать полное изображение, используя par() и / или split.screen(), но также не работает должным образом.Есть ли способ обойти это и получить желаемый результат?

Заранее спасибо!

1 Ответ

0 голосов
/ 31 декабря 2018

Один хакерский способ - использовать функциональность пакета grid.Возьмите выходные данные каждого сюжета / карты и сохраните их как gTree объект, а затем попытайтесь расположить новые объекты в сетке.

library(tmap)
library(cowplot) # for plot_grid() function - good to arrange multiple plots into a grid
library(grid)
library(gridGraphics)

data(World)

tm_shape(World) + tm_polygons()
g1 <- grid.grab()

tm_shape(World[World$continent == 'South America', ]) + tm_polygons()
g2 <- grid.grab()

tm_shape(World[World$name == 'Brazil', ]) + tm_polygons()
g3 <- grid.grab()

# Try to arrange the plots into a grid using cowplot::plot_grid().
# First bind the p2 and p3 as one plot; 
# adjust distance between them by forcing a NULL plot in between.
p23 <- plot_grid(g2, NULL, g3, rel_widths = c(1, -0.7, 1), nrow = 1)
plot_grid(g1, p23, nrow = 2, scale = c(0.8, 1))

Я не мог понять, как заставить его реагировать нааргумент align хотя: / Но, возможно, это ставит вас в какое-то направление исследования, или другие могут редактировать / улучшать этот ответ.

# Save the plot
ggsave(filename = "tmap-arrange-grid-1.png", 
       width = 10, height = 6, units = "cm", dpi = 150)

enter image description here

Обратите внимание, что изначально я думал, что смогу исследовать с помощью добавления NULL объекта к tmap_arrange, например tmap_arrange(p1, NULL, p2, p3, nrow = 2), но, к сожалению, он не принимает его.


Другой подход, основанный на этот связанный вопрос может быть чем-то вроде этого:

library(grid)

grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow = 2, ncol = 2)))
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1:2))
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1))
print(p3, vp = viewport(layout.pos.row = 2, layout.pos.col = 2))

enter image description here

Опять же, здесь у меня не было времениизучить с идеальным выравниванием графиков, но другие могут улучшить этот ответ.

...