并排放置两个R maps()

时间:2018-10-24 00:57:56

标签: r graphics maps

是否可以在一张png图像中并排获得具有相同高度的这两个地图?如下图所示,应以最小但适当的空间分隔两个图像。我接受其他解决方案,尤其是ggmap.

我尝试了par(mar=...(还有mai)来减小边距大小,但这似乎并没有影响两个地图之间的大小或空间。我还在第二个par()函数(用于状态)中使用了cex = 1.8,该函数使两个地图的高度相似,但它们之间的距离更远。

将文件另存为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 :(得分:1)

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

所以我认为您的答案是这样,唯一的变化是pngpar(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)

答案 1 :(得分:0)

受@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