2013-09-25 11 views
7

Próbuję wykreślić mapę Pacyfiku za pomocą World2Hires w bibliotece mapproj R, ale przy próbie wypełnienia krajów jest dziwny błąd. Jak to naprawić?Mapa mapy Pacyfiku z wypełnionymi krajami

library(maps) 
library(mapproj) 
library(mapdata) 
map("world2Hires", 
    xlim=c(120, 260), 
    ylim=c(-60, 40), 
    boundary=TRUE, 
    interior=TRUE, 
    fill=TRUE, 
    col="gray30", 
) 
map.axes() 

Oto wynik:

Broken Map Image

+0

Dla innych poszukujących rozwiązania tego problemu, istnieje kilka innych odpowiedzi. Aby uzyskać rozwiązanie, które pozostawia nienaruszone wielokątów, umożliwiając globalną mapę skupioną na Pac, zobacz http://stackoverflow.com/a/10749877/3897439 od Josh O'Brien. Aby podzielić wielokąty w pobliżu linii danych, zobacz http://stackoverflow.com/a/5538551/3897439 by Joris Meys. –

Odpowiedz

6

Problem wydaje się być z małym podzbiorem obszarów, które powodują zawijanie. Od pewnego próbnego i błędu zapisywania oryginalnego połączenia , takiego jak mapnames <- map(...), a następnie przekazywania podzbiorów tej listy do argumentu regions= w nowym wywołaniu, mogłem uniknąć owijania wypełnień. Np .:

library(maps) 
library(mapproj) 
library(mapdata) 
map("world2Hires", regions=mapnames$names[c(1:7,14:641)], 
    xlim=c(120, 260), 
    ylim=c(-60, 40), 
    boundary=TRUE, 
    interior=TRUE, 
    fill=TRUE 
) 
map.axes() 

enter image description here

Co do dokładniejszej lub sensownego rozwiązania, aby temu zapobiec, jestem zakłopotany. Odtwarzanie z opcją wrap= nic nie pomaga, podobnie jak w przypadku innych opcji. Na marginesie ten problem nie pojawia się przy użyciu bazy danych "world", ale pojawia się tylko dla "world2" i "world2Hires".

+0

Awesome! Dzięki za obejście! – Puzzled79

+0

@ Puzzled79 - podobno ten problem był już wcześniej omawiany tutaj: http://stackoverflow.com/questions/5353184/fixing-maps-library-data-for-pacific-centred-0-360- longitude-display – thelatemail

5

Odpowiedź @thelatemail to najlepsze i najprostsze rozwiązanie, jakie widziałem w tym problemie. Aby było to bardziej uniwersalne, lepiej jest usunąć wielokąty według nazwy. Dzieje się tak dlatego, że w zależności od limitów, które dajesz pierwsze wywołanie map(), indeksy nazw wieloboków mogą być różne.

library(maps) 
library(mapproj) 
library(mapdata) 

mapnames <- map("world2Hires", xlim=c(120, 260), ylim=c(-60, 40), 
       fill=TRUE, plot=FALSE) 

mapnames2 <- map("world2Hires", xlim=c(100, 200), ylim=c(-20, 60), 
       fill=TRUE, plot=FALSE) 

mapnames$names[10] 
[1] "Mali" 
mapnames2$names[10] 
[1] "Thailand" 

Istnieje 8 krajów, które są przecięte na południku zerowym: Wielka Brytania, Francja, Hiszpania, Algieria, Mali, Burkina Faso, Ghana, Togo. Łącząc te nazwy krajów z mapnames$names można usunąć wielokątów niezależnie od oryginalnego stopniu:

remove <- c("UK:Great Britain", "France", "Spain", "Algeria", "Mali", 
      "Burkina Faso", "Ghana", "Togo") 

map("world2Hires", regions=mapnames$names[!(mapnames$names %in% remove)], 
    xlim=c(120, 260), 
    ylim=c(-60, 40), 
    boundary=TRUE, 
    interior=TRUE, 
    fill=TRUE 
) 
map.axes() 

Można również użyć Grepl(), ale dlatego, wielokąty są nazwane heirarchically, można usunąć niektóre podrzędne wielokątów narodów w pytaniu. Na przykład mapnames$names[grepl("UK", mapnames$names)] zwraca 34 dopasowania.

Zaproponowałbym to jako edycję, ale nie mam jeszcze uprawnień.

+0

To jest świetny dodatek rozszerzający się na poprzednią odpowiedź. Identyfikacja konkretnego podzbioru problematycznych krajów jest bardzo pomocna. Jeśli będziesz publikować przydatne informacje w ten sposób, Twój brak przywilejów nie potrwa długo. – thelatemail

+0

Dzięki, @ poczta głosowa! Przyszło mi też do głowy, że wszędzie, gdzie złamana jest mapa, może istnieć rozwiązanie. Można to zrobić nakładając linię N-S (na swojej długości przerwy) na poligony, aby zidentyfikować, które wielokąty przecinają. Być może powyżej (linie, wielokąty)? –

+0

Istnieje ta odpowiedź http://stackoverflow.com/questions/5353184/fixing-maps-library-data-for-pacific-centred-0%C2%B0-360%C2%B0-longitude-display, która zmienia układy wielokątów, które podzielić na całej długości geograficznej. – thelatemail