簡體   English   中英

在ggplot2中繪制地圖時,避免水平線和瘋狂的形狀

[英]Avoiding hoizontal lines and crazy shapes when plotting maps in ggplot2

我想要一個區域的圖,比如拉丁美洲,使用來自IPUMSI的世界形狀文件......

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

...我稍后會添加一些IPUMS區域,所以我真的想用它作為我的模板層。

當我通過coord_map中的coord_map添加限制時,我對繪圖有困難。

初始空間文件看起來不錯

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

在此輸入圖像描述 另一種解決方案是限制視圖,而不是從渲染中刪除點:

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

您應該刪除繪圖區域外的數據。 因此,使用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")

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM