utiliser proj4 pour spécifier la projection Robinson avec les packages R ggmap et ggplot2?

13

Je veux projeter cette carte en projection robinson:

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

entrez la description de l'image ici

Et je voudrais changer la projection en "Robinson" (en suivant les conseils de la réponse à ma question précédente: Quelle projection la carte de la région climatique mondiale de Wikipedia utilise-t-elle?

J'ai eu du mal à trouver une implémentation par défaut de cette projection, j'ai travaillé comme suit pour utiliser la proj4bibliothèque:

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

J'ai essayé un certain nombre d'approches, notamment:

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

mais aucun de ces travaux. Est-ce une faute de frappe ou je manque quelque chose de fondamental à propos de cette méthode?

Abe
la source

Réponses:

11

Il peut être difficile de gérer Robinson depuis ggplot2.

La solution AFAIK ggplot2 coord_map que vous avez explorée utilisera les informations de projection telles que définies dans le package mapproject . Il y en a peu disponibles mais malheureusement Robinson n'en fait pas partie et je ne sais pas si vous pouvez ajouter le vôtre.

Également world données que vous utilisez (du package ggmap je présume) sont déjà une classe de trame de données. Vous ne pourrez donc pas le reprojeter facilement (?).

Ma suggestion serait de recommencer à zéro en utilisant un fichier de forme et de gérer les données géographiques avant de les transmettre à ggplot2. Ma solution superficielle utilisant les données de la Terre naturelle suivrait les étapes suivantes:

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 utilise des informations sur la projection du fichier prj et le résumé me dit maintenant que le monde est maintenant

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]

Et ressemble à ça:

entrez la description de l'image ici

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

Le résumé est maintenant:

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]

Et ça ressemble à ça:

entrez la description de l'image ici

À partir d'ici, vous devriez pouvoir continuer avec ggplot (fortifier pourrait être nécessaire).

radek
la source
7

Vous pouvez maintenant le faire directement avec le ggaltpackage:

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

entrez la description de l'image ici

hrbrmstr
la source