2016-08-22 45 views
2

鑑於以下地圖:極限點到一層

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圖層?

乾杯

回答

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 
+0

只是好奇,爲什麼downvote? – eipi10

+0

不是我。無論如何,謝謝你的答案!我希望解決方案會更簡單,但這將完成工作。 – moman822