Избегание горизонтальных линий и сумасшедших форм при построении карт в ggplot2

Мне нужен участок области, такой как Латинская Америка, с использованием файла формы мира из IPUMSI ...

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

... позже я добавлю еще несколько районов IPUMS, так что я действительно хочу использовать это в качестве уровня моего шаблона

У меня возникли трудности с сюжетом, когда я добавляю ограничения черезcoord_map в ggplot2.

Исходный пространственный файл выглядит хорошо

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

Когда я хочу сосредоточиться на Латинской Америке, я получаю несколько нежелательных горизонтальных линий:

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

Я пытался исправить это с помощьюclipPolys функция, следуя указаниямВот

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

Не очень доволен этим сюжетом. Я думал, что это проблема с отверстиями, как в этомвопрос, но предлагаемое решение дает те же графики, что и выше:

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

Ответы на вопрос(2)

Вы должны удалить данные за пределами области графика. Итак, используйтеscale_x/y_continuous установить пределы вместо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")

Решение Вопроса

Другое решение состоит в том, чтобы ограничить представление, а не удалять точку из рендера:

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))
 NJBurgo09 авг. 2016 г., 17:20
Медленнее, но вы не пропустите ни одной страны.
 dww09 авг. 2016 г., 18:22
Честная оценка. Итак, я думаю, это зависит от конечного использования, которое было бы предпочтительным. «Пропущенные» биты стран - это те части, которые вы указали пропустить, установив ограничения, которые могут быть, а могут и не соответствовать желанию пользователя.
 dww09 авг. 2016 г., 17:17
Я думаю, что это будет медленнее, чем установка пределов в scale_continuous, потому что все данные будут рассчитаны, а затем обрезаны. scale_continuous будет отображать только те данные, которые вы хотите построить.

Ваш ответ на вопрос