Crie um mapa inserido em R

8

Preciso criar um mapa do meu site de amostragem, e o diário solicitou que fizesse um mapa embutido mostrando em que local do mundo esse mapa é, esse é o código do meu mapa.

library(maps)
library(GISTools)  

map('state', fill = FALSE, xlim = c(-125, -114), ylim = c(32.2, 42.5), xlab = "lon", ylab = "lat")
map.axes(cex.axis=0.8)

points(-121.6945, 39.36708, bg = "black", pch = 21)

maps::map.scale(x=-124, y=34, ratio=FALSE, relwidth=0.3)
north.arrow(xb=-116, yb=41, len=0.22, lab="N") 

Eu tentei encontrar uma maneira de fazer o mapa inserido, mas sem sorte até agora.

Derek Corcoran
fonte

Respostas:

7

Você pode usar o 'usr'argumento interno par()para modificar os limites de coordenadas e adicionar um pequeno mapa. Tentei adicionar um mapa do mundo, mas há algum bug dentro do pacote de mapas, os limites não são cortados xlime ylimquando o inmap é adicionado.

map('state', fill = FALSE, xlim = c(-125, -114), ylim = c(32.2, 42.5), xlab = "lon", ylab = "lat")
map.axes(cex.axis=0.8)

points(-121.6945, 39.36708, bg = "black", pch = 21)

maps::map.scale(x=-124, y=34, ratio=FALSE, relwidth=0.3)
north.arrow(xb=-116, yb=41, len=0.22, lab="N") 

# Inmap
par(usr=c(-216, -63, 22, 144))
rect(xleft =-126.2,ybottom = 23.8,xright = -65.5,ytop = 50.6,col = "white")
map("usa", xlim=c(-126.2,-65.5), ylim=c(23.8,50.6),add=T)
map("state", xlim=c(-126.2,-65.5), ylim=c(23.8,50.6),add=T, boundary = F, interior = T, lty=2)
map("state", region="california", fill=T, add=T)
points(-121.6945, 39.36708, bg = "white", pch = 21)

enredo

aldo_tapia
fonte
9

Deixo uma versão ggplot. Você precisa escrever mais códigos. Mas, se você gosta de manipular seus mapas com mais detalhes, eu diria que você deve tentar. Usei dados do GADM para desenhar o mapa principal; Eu baixei o arquivo getData()no rasterpacote. Então, eu usei fortify()para gerar um quadro de dados para o ggplot. Então, desenhei o mapa principal. Usando scale_x_continuous()e scale_y_continuous(), você pode recortar o mapa. O ggsnpacote permite adicionar a seta e a barra de escala. Observe que você precisa especificar onde deseja. Para o mapa inserido, você pode usar dados menores para desenhar os Estados. Então eu usei map_data("state"). Desenhei um mapa e o envolvi ggplotGrob(). Você precisa criar um objeto grob para criar um mapa inserido posteriormente. Finalmente, você usa annotation_custom()e adiciona o mapa inserido ao mapa principal.

library(raster)
library(ggplot2)
library(ggthemes)
library(ggsn)


mapdata <- getData("GADM", country = "usa", level = 1)
mymap <- fortify(mapdata)

mypoint <- data.frame(long = -121.6945, lat = 39.36708)

g1 <- ggplot() +
      geom_blank(data = mymap, aes(x=long, y=lat)) +
      geom_map(data = mymap, map = mymap, 
               aes(group = group, map_id = id),
               fill = "#b2b2b2", color = "black", size = 0.3) +
      geom_point(data = mypoint, aes(x = long, y = lat),
                 color = "black", size = 2) +
      scale_x_continuous(limits = c(-125, -114), expand = c(0, 0)) +
      scale_y_continuous(limits = c(32.2, 42.5), expand = c(0, 0)) +
      theme_map() +
      scalebar(location = "bottomleft", dist = 200,
               dd2km = TRUE, model = 'WGS84',           
               x.min = -124.5, x.max = -114,
               y.min = 33.2, y.max = 42.5) +
      north(x.min = -115.5, x.max = -114,
            y.min = 40.5, y.max = 41.5,
            location = "toprgiht", scale = 0.1)


foo <- map_data("state")

g2 <- ggplotGrob(
        ggplot() +
        geom_polygon(data = foo,
                     aes(x = long, y = lat, group = group),
                     fill = "#b2b2b2", color = "black", size = 0.3) +
        geom_point(data = mypoint, aes(x = long, y = lat),
                   color = "black", size = 2) +
        coord_map("polyconic") +
        theme_map() +
        theme(panel.background = element_rect(fill = NULL))
      )     

g3 <- g1 +
      annotation_custom(grob = g2, xmin = -119, xmax = -114,
                        ymin = 31.5, ymax = 36)

insira a descrição da imagem aqui

jazzurro
fonte
2

Meus dois centavos...

library(maps)
library(GISTools) 

map("state", region= "california", xlim=c(-125.5, -114), ylim=c(32.2, 42.5))
map('state', fill = FALSE, xlim = c(-125, -114), ylim = c(32.2, 42.5), xlab = "lon", ylab = "lat")
map.axes()
points(-121.6945, 39.36708, bg = "black", pch = 21)
maps::map.scale(x=-119.1, y=40, ratio=FALSE, relwidth=0.28)
north.arrow(xb = -116, yb=41, len = 0.22, lab="N")
#inset map
par(usr=c(-125, 9.8, 25, 150))
rect(xleft = -125,ybottom = 25,xright = -66,ytop = 50.5,col = "white")
map("state", add = T)
map("state", region = "california", fill = T, add = T)

insira a descrição da imagem aqui

Rodri
fonte
1

Como alternativa, pode usar o cowplotpacote R de Claus O. Wilke ( cowploté uma extensão poderosa de ggplot2). O autor tem um exemplo sobre a plotagem de uma inserção dentro de um gráfico maior nesta vinheta de introdução .

Aqui está um código adaptado para um exemplo de mapa:

library(cowplot)
library(maps)

fr_df <- map_data("france")
world_df <- map_data("world")
# Map of France
plot_fr <- 
  ggplot() + 
  geom_polygon(data = fr_df, 
               aes(x = long, 
                   y = lat, 
                   group = group)) +
  coord_fixed(1.3) +
  theme_light()

# World map - will be the inset
plot_wolrd <- 
  ggplot() + 
  geom_polygon(data = world_df, 
               aes(x = long, 
                   y = lat, 
                   group = group)) +
  # Underline with red the French borders
  geom_polygon(data = fr_df, 
               aes(x = long, 
                   y = lat, 
                   group = group),
               fill = "red") +
  coord_fixed(1.3) +
  theme_void() +
  # add a bounding box so that will border the inset
  theme(panel.background = element_rect(colour = "black", 
                                        size = 0.5))

# Place the inset
map_with_inset <-
  ggdraw() +
  draw_plot(plot_fr) +
  draw_plot(plot_wolrd, x = 0.15, y = 0.14, width = .25, height = .25)

# Save the map
ggsave(filename = "map_inset.png", 
       plot = map_with_inset, 
       width = 10,
       height = 10,
       units = "cm",
       dpi = 100)

insira a descrição da imagem aqui

Valentin
fonte