将地图上的点限制为一个图层

时间:2016-08-22 00:11:31

标签: r ggplot2 spatial

给出以下地图:

library(data.table)
library(ggplot2)
data.table
test <- data.table(x=c(-89, -85), y=c(40, 35))

state <-as.data.table(map_data("state"))

ggplot() +
  geom_polygon(data=state[region=="illinois"], aes(x=long, y=lat, group=group)) +
  geom_point(data=test, aes(x=x, y=y), col="blue")

是否有一种简单的方法可以限制test data.table中的点的绘图,以便只有geom_polygon图层范围内的点显示在地图上?

干杯

1 个答案:

答案 0 :(得分:3)

您可以使用in.out包中的mgcv函数仅选择多边形内的点。您可以使用它来仅绘制伊利诺伊州边界内的点。下面的示例添加了一个额外的点,它位于伊利诺伊州的矩形范围内,但不在伊利诺伊州的边界内。

library(ggplot2)
library(mgcv)

test <- data.frame(lat=c(40, 35, 39), long=c(-89, -85, -91))

state = map_data("state")

# Limit points only to those inside Illinois
point.filter = in.out(as.matrix(state[state$region=="illinois", c("lat","long")]), 
                      as.matrix(test))

ggplot() +
  geom_polygon(data=state[state$region=="illinois", ], 
               aes(x=long, y=lat, group=group), fill="white", color="black") +
  geom_point(data=test[point.filter, ], aes(x=long, y=lat), col="blue") +
  geom_point(data=test, aes(x=long, y=lat), col="red", pch=1, size=3) +
  coord_map(xlim=range(state[state$region=="illinois",]$long), 
            ylim=range(state[state$region=="illinois",]$lat))

enter image description here

您可以使用in.out来测试一组点中的每一个是否位于多个多边形中的至少一个(例如,多个状态)内,但在这种情况下,每个多边形必须由一行NA。这是一个例子,我们测试一组点是否在连续的48个美国内,但是使用state数据框,每个状态都有一个单独的多边形。为此插图,我添加了两个不在美国境内的要点:

library(dplyr) # For bind_rows() function

# Add an NA row between each state
tmp=lapply(split(state[,c("lat","long","region")], state$region), function(x) {
  bind_rows(list(x, data.frame(region=NA, lat=NA, long=NA)))
})
tmp = bind_rows(tmp)

# Points for testing
test <- data.frame(lat=c(40, 35, 39, -10, 20), long=c(-89, -85, -91, -89, 0))

point.filter = in.out(as.matrix(tmp[, c("lat","long")]), 
                      as.matrix(test))

point.filter    
[1]  TRUE  TRUE  TRUE FALSE FALSE