在 ggplot2 中绘制地图时避免水平线和疯狂的形状
Avoiding hoizontal lines and crazy shapes when plotting maps in ggplot2
我想要一个区域的绘图,例如拉丁美洲,使用 IPUMSI 的世界形状文件...
https://international.ipums.org/international/resources/gis/IPUMSI_world.zip
...我以后会添加更多的IPUMS区所以我真的很想用这个作为我的模板层
当我在 ggplot2 中通过 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))
我尝试按照 here
的指导使用 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")
对这个情节也不是很满意。我认为这是孔的问题,如 question 所示,但建议的解决方案产生与上面相同的图:
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))
您应该删除绘图区域之外的数据。因此,使用 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))
我想要一个区域的绘图,例如拉丁美洲,使用 IPUMSI 的世界形状文件...
https://international.ipums.org/international/resources/gis/IPUMSI_world.zip
...我以后会添加更多的IPUMS区所以我真的很想用这个作为我的模板层
当我在 ggplot2 中通过 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))
我尝试按照 here
的指导使用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")
对这个情节也不是很满意。我认为这是孔的问题,如 question 所示,但建议的解决方案产生与上面相同的图:
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))
您应该删除绘图区域之外的数据。因此,使用 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))