【问题标题】:Limit points on map plot to one layer将地图上的点限制为一层
【发布时间】:2016-08-22 00:11:31
【问题描述】:

给定以下地图:

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 层范围内的点?

干杯

【问题讨论】:

    标签: r ggplot2 spatial


    【解决方案1】:

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

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

    您可以使用in.out 来测试一组点中的每一个是否位于多个多边形中的至少一个(例如,多个状态)内,但在这种情况下,每个多边形必须由一行@987654327 分隔@。这是一个示例,我们测试一组点是否在连续的 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
    

    【讨论】:

    • 不是我。无论如何,谢谢你的回答!我希望解决方案会更简单,但这会完成工作。
    猜你喜欢
    • 2018-12-17
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多