Befestigung maps library-Daten für Pacific centred (0°-360° Länge) display
Ich bin zeichnen einige Punkte auf einer Karte der Welt, die mit dem R maps
- Paket, so etwas wie:
Den Befehl zum zeichnen der base-map ist:
map("world", fill=TRUE, col="white", bg="gray", ylim=c(-60, 90), mar=c(0,0,0,0))
Aber ich brauche, um anzuzeigen, Pazifik zentrierte Karte. Ich benutze map("world2",
etc zu nutzen, die Pazifik-zentrierte Grundkarte aus der Karten-Paket, und konvertieren Sie die Koordinaten der Datenpunkte in mein dataframe (df
) mit:
df$longitude[df$longitude < 0] = df$longitude[df$longitude < 0] + 360
Dies funktioniert, wenn ich nicht verwenden, die fill
option, aber mit fill
die Polygone, die quer 0° Probleme verursachen.
Ich glaube, ich muss für die Transformation der polygon-Daten aus der maps
Bibliothek irgendwie zu lösen, aber ich habe keine Ahnung, wie man das an.
Meine ideale Lösung wäre, ziehen, Karten mit der linken Grenze bei -20° und einer rechten Grenze bei -30° (d.h. 330°). Im folgenden wird die richtigen Punkte und Küsten auf der Karte, aber die überfahrt-null problem ist das gleiche
df$longitude[df$longitude < -20] = df$longitude[d$longitude < -20] + 360
map("world", fill=TRUE, col="white", bg="gray", mar=c(0,0,0,0),
ylim=c(-60, 90), xlim=c(-20, 330))
map("world2", add=TRUE, col="white", bg="gray", fill=TRUE, xlim=c(180, 330))
Jegliche Hilfe würde sehr geschätzt werden.
- Sein, weil die Grenzen nicht bilden geschlossene Formen, weil, wo der Schnitt ist.
- Hier ist ein workaround: Fügen Sie eine große, beliebige Anzahl von df$longitude, sagen zum Beispiel 360. Sollte dies funktionieren, so lange, wie Sie nicht brauchen, um zu zeigen, die Längengrade auf einer Skala. PS. Ich habe dies getan, erfolgreich mit ggplot() Grafik.
- ist ein geschlossenes polygon nur ein offenes polygon mit dem ersten Punkt wiederholt am Ende? Weißt du, wie ich manipulieren kann dieser in den Karten-Paket?
- df ist nur ein dataframe mit den Koordinaten meiner farbigen Punkte auf der Karte Polygone sind Teil der Karten-Bibliothek.
- Ja, das ist richtig. Sie können die
map_data
Funktion inggplot2
um die Daten indata.frame
- format, und überprüfen Sie dann jede Gruppe, um zu sehen, wenn es geschlossen ist, und fügen Sie einen neuen Datenpunkt, wenn nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie die Tatsache, dass intern eine
map
Objekt zurückgegeben von dermap()
Funktion neu berechnet und wieder immap()
Funktion. Ich würde eine Liste erstellen mit einzelnen Polygone, prüfen Sie, welche diejenigen haben sehr unterschiedliche Längen-Werte, und ordnen Sie diese. Ich gab ein Beispiel für diesen Ansatz in der Funktion unten*, die es ermöglicht so etwas wie :bekommen
Wenn ich du wäre, ich würde shift alles ein bisschen mehr, wie in :
Funktion :
*Beachten Sie, dass diese Funktion dauert nur positiv center Werte. Es ist leicht angepasst, um zu ermöglichen, Zentrum-Werte in beide Richtungen, aber ich wollte nicht stören mehr als das ist trivial.
$name
element des map-Objekt.installieren Sie die neueste version von maps (3.2.0).
hierzu:
Ein bisschen spät, aber Sie können auch eine Karte verschoben, indem eine Projektion (benötigt die mapproj-Paket):
Wird diese Verschiebung von 180 Grad. Aber der Unterschied mit "Welt2" ist, dass die Längen-Koordinate werden verschiedene ([-pi,pi]). Alle Projektionen in diesem Paket setzen 0 in der Mitte. Und in diesem Fall die option 'wrap' erkennt das springen richtig.
'resolution=0' hilft, um sauberere Ränder.
Können Sie leicht ändern Sie die centre longitude durch die änderung der " 180 " Wert in der Projektion Beschreibung.