Положить две карты R () рядом - PullRequest
0 голосов
/ 24 октября 2018

Можно ли получить эти две карты рядом, с одинаковой высотой, в одном png-изображении?Два изображения должны быть разделены минимальным, но подходящим пространством, как показано ниже.Я восприимчив к другим решениям, особенно ggmap.

Я пытался par(mar=... (а также mai) уменьшить размер поля, но это, похоже, не влияло на размер или расстояние между двумя картами.Я также использовал cex = 1.8 во второй функции par () (для состояния), которая делает высоту двух карт одинаковой, но разносит их еще дальше.

Когда я сохраняю файл в формате PDF, я получаюкаждая карта на отдельной странице.Когда я пробую png, я получаю только карту Миссури.

MWE:

library(maps)

op <- par(mfrow=c(1,2))
png(file = "maps.png", width = 1000, height = 400)

par(mar=c(0,0,0,0))
map('state')
map('state', 'missouri', add = TRUE, fill = TRUE)
map('state', c('mississippi', 'alabama', 'north carolina', 'florida'), add = TRUE, fill = TRUE, col = "gray")

par(mar=c(0,0,0,0))
map('county', 'missouri')
map('county', 'missouri,scott', add=TRUE, fill=TRUE)

dev.off()

par(op)

Желаемый результат: enter image description here

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вдохновленный комментарием @Andres, я разработал версию ggplot2, которая размещает две карты рядом, используя patchwork.. Мне было проще использовать geom_polygon вместо преобразования карт в sf объекты.

library(maptools)
library(ggplot2)
library(ggthemes) # for Tufte theme
library(patchwork)

# remove the unneeded ink not removed by
# theme_tufte()
theme_tufte_empty <- function(){
  theme(axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks.length = unit(0, "cm"))
}

usa <- map_data("state")
us_missouri <- map_data('state','missouri') #do similar for other states

us_map <- ggplot() + 
  geom_polygon(data = usa, aes(x=long, y = lat, group = group), fill = NA, color = "black") + 
  geom_polygon(data = us_missouri, aes(x = long, y = lat, group = group), fill = "black") +
  theme_tufte() + # quickly remove most ink
  theme_tufte_empty() +  
  coord_fixed(1.3)

missouri <- map_data("county", "missouri")
mo_scott <- map_data("county", "missouri,scott")

mo_map <- ggplot() + 
  geom_polygon(data = missouri, aes(x=long, y = lat, group = group), fill = NA, color = "black") + 
  geom_polygon(data = mo_scott, aes(x = long, y = lat, group = group), fill = "black") +
  theme_tufte() +
  theme_tufte_empty() +
  coord_fixed(1.3)

us_map + mo_map + plot_layout(ncol = 2, widths = c(1.5,1))

enter image description here

0 голосов
/ 24 октября 2018

Опции par относятся к активному «графическому устройству» в данный момент.Для демонстрации:

Попробуйте, начиная с «нормальной» (не файловой) графики.

par(mfrow=1:2)
par('mfrow')
# [1] 1 2
png("maps.png")
par('mfrow')
# [1] 1 1
dev.off()
# windows 
#       2 
par('mfrow')
# [1] 1 2

Я не закрывал предыдущее обычное графическое окно, поэтому после закрытияустройство png, ранее активное окно снова стало активным.И он все еще думал mfrow=1:2.

Так что я думаю, что ваш ответ таков, где единственным изменением является порядок png, par(mfrow=1:2).

png(file = "maps.png", width = 1000, height = 400)
op <- par(mfrow=c(1,2))

par(mar=c(0,0,0,0))
map('state')
map('state', 'missouri', add = TRUE, fill = TRUE)
map('state', c('mississippi', 'alabama', 'north carolina', 'florida'), add = TRUE, fill = TRUE, col = "gray")

par(mar=c(0,0,0,0))
map('county', 'missouri')
map('county', 'missouri,scott', add=TRUE, fill=TRUE)

dev.off()

par(op)
...