使用ggplot在绘图上绘制地图

时间:2018-07-20 07:49:18

标签: r ggplot2 shapefile

如果要在地图上绘制地图,请执行

library(ggplot2)
library(sf)
library(cowplot)
library(gridExtra)
library(raster)

df <- data.frame(x = 1980:1999, y = sample(1:20, 20, replace = T))
shp.dat <- getData('GADM', country='FRA', level=1)

shp.dat <- shp.dat %>% st_as_sf()

p <- ggplot(df, aes(x = x, y = y)) + geom_line() + ylim(0, 100)
p.shp <- ggplot() +  
        geom_sf(data = shp.dat, fill = ifelse(shp.dat$ID_1 == 1,"red", "grey")) 
inset_map <- ggdraw() + draw_plot(p, 0, 0, 1, 1) + draw_plot(p.shp, 0.5, 0.52, 0.5, 0.4) 
inset_map

enter image description here

现在我有四个这样的情节

  df <- data.frame(x = 1980:1999, 
                 y1 = sample(1:20, 20, replace = T), 
                 y2 = sample(1:20, 20, replace = T), 
                 y3 = sample(1:20, 20, replace = T), 
                 y4 = sample(1:20, 20, replace = T))


p1 <- ggplot(df, aes(x = x, y = y1)) + geom_line() + ylim(0, 100)
p2 <- ggplot(df, aes(x = x, y = y2)) + geom_line() + ylim(0, 100)
p3 <- ggplot(df, aes(x = x, y = y3)) + geom_line() + ylim(0, 100)
p4 <- ggplot(df, aes(x = x, y = y4)) + geom_line() + ylim(0, 100)

pp <- grid.arrange(p1, p2, p3, p4, ncol = 2)

对于每个图,我想将地图添加为插图

inset_map <- ggdraw() + draw_plot(pp, 0, 0, 1, 1) + draw_plot(p.shp, 0.5, 0.52, 0.5, 0.4)

enter image description here

如何在每个图中分别将地图显示为插图?

1 个答案:

答案 0 :(得分:1)

在将结果传递到inset_map之前,您可以应用与生成单个grid.arrange()相同的代码逻辑:

plot.list <- list(p1, p2, p3, p4)

plot.list %>%

  # add inset map to each plot in the list
  lapply(function(p) ggdraw() + 
           draw_plot(p, 0, 0, 1, 1) + 
           draw_plot(p.shp, 0.5, 0.52, 0.5, 0.4)) %>%

  # convert each plot in the list to grob
  lapply(ggplotGrob) %>%

  # arrange in grid, as before
  grid.arrange(grobs = ., ncol = 2)

plot