Tạo một bản đồ chèn trong R


8

Tôi cần tạo một bản đồ của trang web lấy mẫu của mình và tạp chí đã yêu cầu tạo một bản đồ nội bộ cho biết bản đồ này ở đâu trên thế giới, đây là mã bản đồ của tôi.

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") 

Tôi đã cố gắng tìm cách tạo ra bản đồ chèn nhưng không có may mắn cho đến nay.

Câu trả lời:


7

Bạn có thể sử dụng 'usr'đối số bên trong par()để sửa đổi giới hạn tọa độ và thêm một bản đồ nhỏ. Tôi đã cố gắng thêm bản đồ thế giới, nhưng có một số lỗi trong gói bản đồ, giới hạn không bị cắt xén xlimylimkhi inmap được thêm vào.

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)

âm mưu


9

Tôi để lại một phiên bản ggplot. Bạn cần viết thêm mã. Nhưng, nếu bạn thích thao túng bản đồ của mình với nhiều chi tiết hơn, tôi sẽ nói hãy thử xem. Tôi đã sử dụng dữ liệu GADM để vẽ bản đồ chính; Tôi tải tập tin với getData()trong rastergói. Sau đó, tôi đã sử dụng fortify()để tạo khung dữ liệu cho ggplot. Sau đó, tôi vẽ bản đồ chính. Sử dụng scale_x_continuous()scale_y_continuous(), bạn có thể cắt bản đồ. Các ggsngói cho phép bạn thêm vào mũi tên và quy mô quán bar. Lưu ý rằng bạn cần xác định nơi bạn muốn họ. Đối với bản đồ chèn, bạn có thể sử dụng dữ liệu nhỏ hơn để vẽ các Bang. Vì vậy, tôi đã sử dụng map_data("state"). Tôi đã vẽ một bản đồ và bọc nó lại ggplotGrob(). Bạn cần tạo một đối tượng grob để tạo bản đồ chèn sau. Cuối cùng, bạn sử dụng annotation_custom()và thêm bản đồ chèn vào bản đồ chính.

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)

nhập mô tả hình ảnh ở đây


2

Theo quan điểm của tôi...

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)

nhập mô tả hình ảnh ở đây


1

Ngoài ra, có thể sử dụng cowplotgói R của Claus O. Wilke ( cowplotlà một phần mở rộng mạnh mẽ của ggplot2). Tác giả có một ví dụ về việc vẽ một hình nhỏ bên trong một biểu đồ lớn hơn trong họa tiết giới thiệu này .

Dưới đây là một số mã phù hợp cho một ví dụ bản đồ:

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)

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.