вставить карту с помощью ggplot2

Я просто пытаюсь сделать простую карту области исследования, которая также содержит врезку штата, в котором я работаю (Северная Каролина). Я хотел бы преобразовать карту-врезку в объект grob, чтобы нанести его на карту основной области исследования, а затем использовать ggsave, чтобы сохранить карту в виде изображения, pdf и т. д. Я использую шейп-файлы для моей фактической карты, но я буду показать вам, что я пытаюсь использовать map_data:

library(ggplot2)
library(ggmap)
library(maps)
library(mapdata)
library(gridExtra)
library(grid)

# get the NC data:
states <- map_data("state")
nc_df <- subset(states, region == "north carolina")

# study area map:
nc_base <- ggplot() + 
geom_polygon(data = nc_df, aes(x = long, y = lat, group = group), fill="grey", color="black") +
coord_fixed(xlim=c(-80, -77.5), ylim=c(33.5, 34.9), ratio = 1.3) +
theme_bw()
nc_base

# inset map:
insetmap<-ggplot() + 
geom_polygon(data = nc_df, aes(x = long, y = lat, group = group), fill="grey", color="black")  + # get the state border back on top
coord_fixed(ratio = 1.3) +
annotate(geom = "rect", ymax = 34.9, ymin = 33.5, xmax = -77.5, xmin = -80, colour = "red", fill = NA) +
ylab("") +
xlab("") +
theme_nothing()
insetmap

insetmap.grob <- ggplotGrob(insetmap)

final_map <- nc_base + annotation_custom(insetmap.grob, xmin=-79.5, xmax=-79, ymin=33.75, ymax=34)
final_map

Когда я запускаю сценарий для создания окончательной карты, создается только карта изучаемой области. Мне интересно, неправильно ли я использую ggplotGrob или это что-то еще? Возможно, я где-то читал, что функция annotation_custom не работает, если вы не используете функцию coord_cartesian в ggplot2 (и здесь я использую coord_fixed). Если это так, могу ли я увеличить масштаб аналогичным образом с помощью этой функции, или есть другая функция coord_ для увеличения карты моей изучаемой области?

Спасибо, Джей


person Jason    schedule 13.12.2015    source источник
comment
это или эта помощь?   -  person eipi10    schedule 13.12.2015
comment
@ Джейсон, ты решил эту проблему? Если да то как. У меня точно такая же проблема. Спасибо   -  person Cirrus    schedule 20.09.2016


Ответы (1)


Я делаю такие вещи довольно часто и обнаружил, что подход grid::viewport работает хорошо... хотя обратите внимание, что вы не можете использовать ggsave при работе с несколькими окнами просмотра, поскольку ggsave сохранит только последнее окно просмотра. Пытаться:

nc_base <- ggplot() + 
  geom_polygon(data = nc_df, aes(x = long, y = lat, group = group), fill="grey", color="black") +
  coord_fixed(xlim=c(-80, -77.5), ylim=c(33.5, 34.9), ratio = 1.3) +
  theme_bw()
print(nc_base)

# inset map:
insetmap <- ggplot() + 
  geom_polygon(data = nc_df, aes(x = long, y = lat, group = group), fill="grey", color="black")  + # get the state border back on top
  coord_fixed(ratio = 1.3) +
  annotate(geom = "rect", ymax = 34.9, ymin = 33.5, xmax = -77.5, xmin = -80, colour = "red", fill = NA) +
  ylab("") +
  xlab("") + 
# used theme_inset instead of theme_nothing
  theme_inset()
print(insetmap)

# save where you want to with filename arg in png(). Currently saves 'map.png' to your working directory
# set resolution, width, height
png(filename = "map.png", width = 1150, height = 800, res = 300)
# create a viewport for inset
# vp_inset width/height arguments set the size of the inset; x and y arguments set the position (from 0 to 1) of the left, top corner of the inset along each axis (i.e. not map coordinates as you have in your annotation custom). You can adjust these as you see fit.
vp_inset <- grid::viewport(width = 0.35, height = 0.35, x = 0.2, y = 0.5, just = c("left", "top"))
print(nc_base)
print(insetmap, vp = vp_inset)
dev.off()

введите здесь описание изображения

person sebdalgarno    schedule 28.02.2018
comment
не могли бы вы помочь мне в том, как сделать часть многострочного графика (четыре строки), увеличить часть графика и вставить его с помощью R, я очень ценю, и у меня возникают трудности! - person Stackuser; 12.02.2020