¿usa proj4 para especificar la proyección de Robinson con los paquetes R ggmap y ggplot2?

13

Quiero proyectar este mapa en proyección robinson:

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

ingrese la descripción de la imagen aquí

Y me gustaría cambiar la proyección a "Robinson" (siguiendo los consejos de la respuesta a mi pregunta anterior: ¿Qué proyección usa el mapa de la región climática global de Wikipedia?

Me costó encontrar una implementación predeterminada de esta proyección, resolví lo siguiente para usar la proj4biblioteca:

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

He intentado una serie de enfoques, que incluyen:

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

pero ninguno de estos funciona. ¿Es un error tipográfico o me falta algo fundamental sobre este método?

Abe
fuente

Respuestas:

11

Puede ser complicado manejar a Robinson desde ggplot2.

La solución AFAIK ggplot2 coord_map que exploró utilizará la información de proyección como se define en el paquete mapproject . Hay pocos disponibles allí, pero desafortunadamente Robinson no es uno de ellos y no estoy seguro de si puede agregar el suyo.

Además, los worlddatos que está utilizando (del paquete ggmap, supongo) ya son una clase de marco de datos. Por lo tanto, no podrá volver a proyectarlo fácilmente (?).

Mi sugerencia sería comenzar desde cero usando un archivo de forma y manejar datos geográficos antes de pasarlos a ggplot2. Mi solución superficial usando datos de la Tierra Natural seguiría estos pasos:

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 usa información sobre la proyección del archivo prj y el resumen ahora me dice que el mundo ahora es

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]

Y se ve así:

ingrese la descripción de la imagen aquí

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

El resumen es ahora:

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]

Y se ve así:

ingrese la descripción de la imagen aquí

Desde aquí, debería poder continuar con ggplot (podría ser necesario fortificar).

radek
fuente
7

Ahora puede hacer esto directamente con el ggaltpaquete:

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

ingrese la descripción de la imagen aquí

hrbrmstr
fuente