sử dụng proj4 để chỉ định phép chiếu Robinson với các gói ggmap và ggplot2?


13

Tôi muốn chiếu bản đồ này trong dự đoán robinson:

library(ggmap)
world <- map_data("world")
ggplot() + geom_path(data = world, 
                              aes(long, lat, group = group))

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

Và tôi muốn thay đổi phép chiếu thành "Robinson" (theo lời khuyên từ câu trả lời cho câu hỏi trước đây của tôi: Bản đồ khu vực khí hậu toàn cầu từ Wikipedia sử dụng phép chiếu nào?

Tôi đã có một thời gian khó khăn để tìm một triển khai mặc định của phép chiếu này, tôi đã tìm ra cách sau để sử dụng proj4thư viện:

library(proj4)
robinson <- project(cbind(world$long, world$lat), 
                    proj = "+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")

Tôi đã thử một số cách tiếp cận, bao gồm:

# using ggmap::get.map()
get_map("world", projection = mapprojection(robinson))
# using ggplot2::coord_map
coord_map(projection = robinson)
# and sp::coordinates:
library(sp)
coordinates(world) <- ~ lat + long
gridded(world) <- TRUE # returns error
proj4string(world) <- CRS(robinson)

nhưng không ai trong số này làm việc Đây có phải là một lỗi đánh máy, hoặc tôi thiếu một cái gì đó cơ bản về phương pháp này?

Câu trả lời:


11

Có thể khó xử lý Robinson từ trong ggplot2.

AFAIK ggplot2 coord_map giải pháp bạn khám phá sẽ sử dụng thông tin dự báo theo quy định tại mapproject gói. Có rất ít có sẵn ở đó nhưng tiếc là Robinson không phải là một trong số họ và tôi không chắc liệu bạn có thể thêm cái riêng của mình không.

Ngoài ra - worlddữ liệu bạn đang sử dụng (từ gói ggmap tôi đoán) đã là một lớp khung dữ liệu. Vì vậy, bạn sẽ không thể từ chối nó một cách dễ dàng (?).

Đề xuất của tôi sẽ bắt đầu từ đầu bằng cách sử dụng tệp hình dạng và xử lý dữ liệu địa lý trước khi chuyển chúng đến ggplot2. Giải pháp chữ thảo của tôi sử dụng dữ liệu Trái đất tự nhiên sẽ tuân theo các bước sau:

library(ggplot2)
library(grid)

# get data
download.file(url="http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip", "ne_110m_admin_0_countries.zip", "auto")
unzip("ne_110m_admin_0_countries.zip")
file.remove("ne_110m_admin_0_countries.zip")

# read shape file using rgdal library
library(rgdal)
ogrInfo(".", "ne_110m_admin_0_countries")
world <- readOGR(".", "ne_110m_admin_0_countries")
summary(world)  
plot(world, col = "grey")  

readOGR sử dụng thông tin về phép chiếu từ tệp prj và tóm tắt bây giờ cho tôi biết rằng thế giới bây giờ

Object of class SpatialPolygonsDataFrame
Coordinates:
   min       max
x -180 180.00000
y  -90  83.64513
Is projected: FALSE 
proj4string :
[+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0]

Và trông như thế:

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

Hãy biến thành Robinson:

worldRobinson <- spTransform(world, CRS("+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"))
summary(worldRobinson)  
plot(worldRobinson, col = "grey")  

Tóm tắt là ngay bây giờ:

Object of class SpatialPolygonsDataFrame
Coordinates:
        min      max
x -16810131 16810131
y  -8625154  8343004
Is projected: TRUE 
proj4string :
[+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs +towgs84=0,0,0]

Và có vẻ như thế:

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

Từ đây bạn sẽ có thể tiếp tục với ggplot (có thể cần củng cố).


7

Bây giờ bạn có thể làm điều này trực tiếp với ggaltgói:

library(ggplot2)
library(ggalt)
library(ggthemes)

wrld <- map_data("world")

gg <- ggplot()
gg <- gg + geom_map(data=wrld, map=wrld,
                    aes(x=long, y=lat, map_id=region),
                    color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + coord_proj("+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
gg <- gg + theme_map()
gg

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.