r - 将网格外的点绘制为指向 R 中 ggplot2 数据的箭头

标签 r dictionary plot ggplot2 ggmap

我正在使用世界比例的数据生成 map ,然后放大到某些区域。在放大 View 中,我想通过将箭头从框的中心指向数据点在外部世界中的位置来显示边界框之外还有其他数据点。

注:我不需要它是“大圆”路径,只是墨卡托投影中的 XY 向量,因为我想这对“正常”图也很有用。

例如,这里是显示数据范围的世界地图:

enter image description here

这是放大的 View ,手动添加了洋红色箭头以显示我想要生成的内容。

close-up

下面是我用来生成这两个基本图的代码和数据。我需要的是一种生成箭头的方法。

require(ggplot2)

te = structure(list(lat = c(33.7399, 32.8571, 50.2214, 36.96263, 33.5835, 
33.54557, 47.76147, 48, 59.40289, 35.93411, 32.87962, 38.3241, 
50.03844, 37.44, 50.07774, 50.26668, 36.5944), lng = c(-118.37608, 
-117.25746, -5.3865, -122.00809, -117.86159, -117.79805, -124.45055, 
-126, -146.35157, -122.931472, -117.25285, -123.07331, -5.26339, 
25.4, -5.709894, -3.86828, -121.96201)), .Names = c("lat", "lng"
), class = "data.frame", row.names = c(NA, -17L))

all_states = map_data("world")

# world version:
wp = ggplot() + 
      geom_polygon(data = all_states, aes(x = long, y = lat, group = group), colour = "gray",
                   fill = "gray") +
      coord_cartesian(ylim = c(0, 80), xlim = c(-155, 45)) + 
      geom_point(data = te, aes(x = lng, y = lat), color = "blue", size = 5,alpha = 0.6)

print(wp)

#states plot
sp = ggplot() +
      geom_polygon(data = all_states, aes(x = long, y = lat, group = group), colour = "gray", fill = "gray") +
      coord_cartesian(ylim = c(30, 52), xlim = c(-128, -114)) + 
      geom_point(data = te, aes(x = lng, y = lat), color = "blue", size = 5, alpha = 0.6) 

print(sp)

最佳答案

此解决方案使用 sprgeos包来操作空间数据,主要的症结是相交的线和一个盒子多边形来获取箭头的边缘点。那么如果你用 geom_segment 绘制箭头和零宽度,线是不可见的,只剩下箭头。

此函数计算线框交点:

boxint <- function(xlim, ylim, xp, yp){
    ## build box as SpatialPolygons
    box = cbind(xlim[c(1,2,2,1,1)],
        ylim[c(1,1,2,2,1)])
    box <- sp::SpatialPolygons(list(sp::Polygons(list(sp::Polygon(box)),ID=1)))

    ## get centre of box
    x0=mean(xlim)
    y0=mean(ylim)

    ## construct line segments to points
    sl = sp::SpatialLines(
        lapply(1:length(xp),
               function(i){
                   sp::Lines(list(sp::Line(cbind(c(x0,xp[i]),c(y0,yp[i])))),ID=i)
               }
               )
        )
    ## intersect lines segments with boxes to make points
    pts = rgeos::gIntersection(sl, as(box, "SpatialLines"))
    as.data.frame(sp::coordinates(pts), row.names=1:length(xp))
}

这将返回 geom带箭头:
wherelse <- function(xlim, ylim, points){
    ## get points outside bounding box
    outsides = points[!(
        points$lng>=xlim[1] &
            points$lng <= xlim[2] &
                points$lat >= ylim[1] &
                    points$lat <= ylim[2]),]
    npts = nrow(outsides)
    ## get centre point of box
    x = rep(mean(xlim),npts)
    y = rep(mean(ylim),npts)

    ## compute box-point intersections
    pts = boxint(xlim, ylim, outsides$lng, outsides$lat)
    pts$x0=x
    pts$y0=y
    ## create arrow segments as invisible lines with visible arrowheads
    ggplot2::geom_segment(data=pts, aes(x=x0,y=y0,xend=x,yend=y),
       lwd=0, arrow=grid::arrow(length=unit(0.5,"cm"),
       type="closed"),col="magenta")
}

所以你的例子,基本情节是:
sp = ggplot() + 
  geom_polygon(
   data=all_states, 
    aes(x=long, y=lat, group = group),colour="gray",fill="gray" ) + 
    coord_cartesian(ylim=c(30, 52), xlim=c(-128,-114)) + 
    geom_point(data=te,aes(x=lng,y=lat),color="blue",size=5,alpha=0.6)

然后添加箭头:
sp + wherelse(c(-128,-114), c(30,52), te)

enter image description here

不确定是否可以选择完全按照您想要的方式绘制箭头!

关于r - 将网格外的点绘制为指向 R 中 ggplot2 数据的箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30131061/

相关文章:

python - 将表格转换为分层字典?

Java GRIB 文件打开器

dictionary - 嵌套字典中无意义的MethodError?

matlab - 如何在轴中使用刻度而不指定刻度的最后一个值?

r - Tidyr 的 gather() 与 NAs

r - 如何在r中使用Predict.lm来逆转回归

R Shiny : read data file, 让用户选择变量,用 ggplot 作图

r - 如何添加具有 NA 的行作为 R 中的先前列?

r - 在glmnet中绘制ROC曲线

javascript - 使用 Google Maps API 绘制 map 路径/航路点并播放路线