2016-08-09 54 views
8

chcę działkę o powierzchni, takich jak Ameryce Łacińskiej, używając pliku świat kształt z IPUMSI ...Unikanie hoizontal linie i szalone kształty podczas kreślenia map w ggplot2

https://international.ipums.org/international/resources/gis/IPUMSI_world.zip

... ja doda później więcej dzielnic IPUMS, więc naprawdę chcę użyć tego jako mojej warstwy szablonu.

Mam trudności z działką, gdy dodam ograniczenia przez coord_map w ggplot2.

Początkowy plik przestrzenny wygląda w porządku

library("ggplot2") 
library("raster") 

sd0 <- readShapePoly("./IPUMSI_world.shp") 
df0 <- fortify(sd0) 

ggplot(data = df0, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") 

enter image description here

Kiedy chcę skupić się na Ameryce Łacińskiej mam pewne niepożądane linie poziome:

ggplot(data = df0, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") + 
    coord_map(xlim = c(-125, -30), ylim = c(-60, 35)) 

enter image description here

I próbowałem naprawić to za pomocą clipPolys funkcji, zgodnie z wytycznymi here

library("PBSmapping") 
df1 <- df0 
names(df1)[c(1,2,6,3)] <- c("X","Y","PID","POS") 
df1$PID <- as.numeric(df1$PID) 
df2 <- clipPolys(polys = df1, xlim = c(-125, -30), ylim = c(-60, 35), keepExtra = TRUE) 
names(df2)[names(df2)=="X"] <- "long" 
names(df2)[names(df2)=="Y"] <- "lat" 
names(df2)[names(df2)=="PID"] <- "id" 

ggplot(data = df2, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") 

enter image description here

Nie naprawdę bardzo zadowoleni z tej działki obu. Myślałem, że to problem z otworami, jak w tym question, ale proponowane rozwiązanie daje te same wykresy jak wyżej:

gghole <- function(fort){ 
    poly <- fort[fort$id %in% fort[fort$hole,]$id,] 
    hole <- fort[!fort$id %in% fort[fort$hole,]$id,] 
    out <- list(poly,hole) 
    names(out) <- c('poly','hole') 
    return(out) 
} 

ggplot(df2, aes(x=long, y=lat, group=group)) + 
    geom_polygon(data = gghole(df2)[[1]], fill = "black", colour = "black") + 
    geom_polygon(data = gghole(df2)[[2]], fill = "black", colour = "black") 

ggplot(df0, aes(x=long, y=lat, group=group)) + 
    geom_polygon(data = gghole(df0)[[1]], fill = "black", colour = "black") + 
    geom_polygon(data = gghole(df0)[[2]], fill = "black", colour = "black") + 
    coord_map(xlim = c(-125, -30), ylim = c(-60, 35)) 

Odpowiedz

8

enter image description here Innym rozwiązaniem jest ograniczenie widoku, zamiast usunąć punkt z tynku:

library(ggplot2) 
library(maptools) 
library(mapproj) 

# Maptools dataset 
data(wrld_simpl) 
world <- fortify(wrld_simpl) 

# Same plot, but restrict the view instead of removing points 
# allowing the complete render to happen 
ggplot(world, mapping = aes(x = long, y = lat, group = group)) + 
    geom_polygon(fill = "black", colour = "black") + 
    coord_cartesian(xlim = c(-125, -30), ylim = c(-60, 35)) 
+0

myślę, że to będzie wolniejszy niż ustawienie limitów w scale_continuous, ponieważ całe dane zostaną obliczone, a następnie przycięte. scale_continuous wyświetli tylko dane, które chcesz narysować. – dww

+0

Wolniej, ale nie dostaniesz kawałków krajów. – NJBurgo

+0

Punkt targów. Sądzę więc, że zależy to od końcowego zastosowania, które byłoby preferowane. "Brakujące" bity krajów to części, które powinieneś pominąć, ustawiając limity, które mogą być lub nie są tym, czego użytkownik chce. – dww

4

Należy usunąć dane poza regionem działce. Tak, użyj scale_x/y_continuous ustawić limity zamiast coord_map

ggplot(data = df0, mapping = aes(x = long, y = lat, group = group)) + 
    scale_x_continuous(limits = c(-125, -30)) + 
    scale_y_continuous(limits = c(-60, 35)) + 
    geom_polygon(fill = "black", colour = "black") 

enter image description here