Verwenden Sie proj4, um die Robinson-Projektion mit den Paketen R ggmap und ggplot2 anzugeben.

13

Ich möchte diese Karte in Robinson-Projektion projizieren:

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

Bildbeschreibung hier eingeben

Und ich möchte die Projektion in "Robinson" ändern (nach dem Ratschlag aus der Antwort auf meine vorherige Frage: Welche Projektion verwendet die globale Klimaregionskarte von Wikipedia?

Es fiel mir schwer, eine Standardimplementierung dieser Projektion zu finden, und ich habe Folgendes für die Verwendung der proj4Bibliothek herausgefunden:

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

Ich habe eine Reihe von Ansätzen ausprobiert, darunter:

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

aber keine dieser arbeiten. Ist es ein Tippfehler oder fehlt mir etwas Grundlegendes an dieser Methode?

Abe
quelle

Antworten:

11

Es könnte schwierig sein, mit Robinson in ggplot2 umzugehen.

Die von Ihnen untersuchte AFAIK ggplot2 coord_map- Lösung verwendet die Projektionsinformationen, die im mapproject- Paket definiert sind . Es sind nur wenige verfügbar, aber Robinson ist leider keiner von ihnen und ich bin mir nicht sicher, ob Sie Ihre eigenen hinzufügen können.

Außerdem worldsind die von Ihnen verwendeten Daten (vermutlich aus dem ggmap-Paket) bereits eine Datenrahmenklasse. Sie können es also nicht einfach neu projizieren (?).

Mein Vorschlag wäre, mit der Formdatei von vorne zu beginnen und geografische Daten zu verarbeiten, bevor sie an ggplot2 übergeben werden. Meine vorläufige Lösung mit Natural Earth- Daten würde die folgenden Schritte ausführen:

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 Verwendet Informationen über die Projektion aus der PRJ-Datei und Zusammenfassung sagt mir jetzt, dass die Welt jetzt ist

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]

Und sieht so aus:

Bildbeschreibung hier eingeben

Lassen Sie uns zu Robinson transformieren:

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

Zusammenfassung ist jetzt:

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]

Und so sieht es aus:

Bildbeschreibung hier eingeben

Von hier aus sollten Sie in der Lage sein, mit ggplot fortzufahren (möglicherweise ist eine Verstärkung erforderlich).

radek
quelle
7

Sie können dies jetzt direkt mit dem ggaltPaket tun :

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

Bildbeschreibung hier eingeben

hrbrmstr
quelle