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

13

Quiero proyectar este mapa en proyección de Robinson:

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

Ymegustaríacambiarlaproyeccióna"Robinson" (siguiendo los consejos de la respuesta a mi pregunta anterior: ¿Qué hace la proyección? ¿El mapa de la región del clima global de Wikipedia usa?

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

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, entre ellos:

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

    
pregunta Abe 20.12.2012 - 00:03

2 respuestas

11

Puede ser complicado manejar Robinson desde ggplot2.

AFAIK ggplot2 coord_map que exploró usará la información de proyección tal como se define en mapproject . Hay pocos disponibles allí, pero lamentablemente Robinson no es uno de ellos  y no estoy seguro de si puedes agregar el tuyo.

También: los datos world que está utilizando (según supongo del paquete ggmap) ya es una clase de marco de datos. Por lo tanto, no podrá reproyectarlo fácilmente (?).

Mi sugerencia sería comenzar desde cero utilizando un archivo de forma y manejar datos geográficos antes de pasarlos a ggplot2. Mi solución superficial utilizando los datos de Natural Earth 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 es ahora

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í:

TransformemosaRobinson:

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 parece a eso:

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

    
respondido por el radek 20.12.2012 - 14:52
7

Ahora puede hacer esto directamente con el paquete ggalt :

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

    
respondido por el hrbrmstr 25.03.2016 - 16:47

Lea otras preguntas en las etiquetas