【问题标题】:How to overlay lat/lon points on a spatial map in ggplot?如何在ggplot中的空间地图上叠加纬度/经度点?
【发布时间】:2021-03-01 10:58:34
【问题描述】:

我已经成功地创建了一张可以在下面工作的欧洲地图。

  1. 如何添加具有纬度和经度的数据集(.csv 格式)。我在下面制作了一个虚拟数据集,我需要为每个Place 覆盖纬度/经度,并用x 标记metricAo 标记metricB。有什么办法可以做到吗?

  2. 地图非常小,而边距非常大。我尝试根据堆栈溢出R ggplot, remove white margins in ggsave/ggplot 的此示例添加theme(plot.margin=grid::unit(c(0,0,0,0), "mm")),但是当我在coord_sf(xlim = c(-40, 60), ylim = c(30, 90)) + 之前添加它时,我得到一个错误

Error in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : polygon edge not found 当我之后添加它时,它不会改变边距以使情节更大。怎么做才能让图形变大,边距变小?

 library("ggplot2")
 theme_set(theme_bw())
 library("sf")
 library("rnaturalearth") 
 library("rnaturalearthdata")

 world <- ne_countries(scale = "medium", returnclass = "sf") 
 class(world)
             
ggplot(data = world) +
geom_sf(color = "black", fill = "grey") +  
coord_sf(xlim = c(-40, 60), ylim = c(30, 90)) +
ggtitle("Europe") +
xlab('Longitude') + ylab('Latitude'))

数据集:

 Place  MetricA    MetricB   Lat   Lon
 A                   x       55    -40
 B      x                    60    -20
 C                   x       75     18
 D      x            x       68     3
 E                   x       35     18
 F                   x       74     42
 G      x                    62    -26
 H                   x       30    -30
 I      x            x       69     15

【问题讨论】:

    标签: r ggplot2 spatial


    【解决方案1】:

    我相信我已经回答了你一半的问题。本质上,geom_sf 相对于其他ggplot2 几何图形的行为有些特殊,因为它强制地图的纵横比。起初我对此感到有些沮丧,但在映射方面确实很有意义。要更改边距大小,您只需更改绘图的纵横比,在导出时通过输入不同的数字调整高度和宽度的比率,或者在 RStudio 会话中通过拉动绘图窗格。

    至于你的第二个问题,我忘了具体的,但我知道答案在这里https://www.r-spatial.org/r/2018/10/25/ggplot2-sf-2.html已经很清楚了。

    好好休息,祝你的项目好运。

    【讨论】:

    • 嗨 Omri,我 geom_sf(size=0.25) 和 geom_sf(size-3) 它改变了图形内部的大小,但不改变整体地图的大小。你推荐一种不同的方法来改变纵横比吗?谢谢!
    • 更改绘图大小不会解决问题。事实上,我不相信对 ggplot 本身做任何事情会解决这个问题。当您使用 pdf、png 等命令导出时,您可以将高度和宽度更改为正确的比例。或者,您可以在 RStudio 中拖动标有“绘图”的窗格边缘以更改纵横比。大边距的问题在于如何查看情节,而不是情节本身。
    【解决方案2】:

    你可以用这样的点覆盖你的地图:

    1. 通过例如将您的数据集转换为长格式tidyr::pivot_longer 让度量变量成为一个变量的类别
    2. 通过geom_point 将点添加到您的地图中,您可以在其中将新的度量变量映射到“shape”上
    3. 通过scale_shape_manual设置所需的形状

    关于你的第二个问题。我无法重现您的错误。调整绘图边距效果很好。但是,我不确定这是否足以在保存或绘图时删除边距。正如@OmriNewett 已经指出的那样,问题在于地图的特殊之处在于纵横比是固定的,并且要消除边距,您必须设置宽度和高度的比率以匹配固定的纵横比。

    library(tidyr)
    library(dplyr)
    library("ggplot2")
    library("sf")
    #> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
    library("rnaturalearth") 
    library("rnaturalearthdata")
    
    theme_set(theme_bw())
    
    world <- ne_countries(scale = "medium", returnclass = "sf") 
    
    d <- read.table(text = "Place  MetricA    MetricB   Lat   Lon
     A      NA             x       55    -40
     B      x           NA       60    -20
     C      NA           x       75     18
     D      x            x       68     3
     E      NA           x       35     18
     F      NA           x       74     42
     G      x           NA       62    -26
     H      NA           x       30    -30
     I      x            x       69     15", header = TRUE)
    
    d <- d %>% 
      tidyr::pivot_longer(-c(Place, Lat, Lon), names_to = "Metric") %>% 
      filter(!is.na(value))
    
    ggplot(data = world) +
      geom_sf(color = "black", fill = "grey") +
      geom_point(data = d, aes(x = Lon, y = Lat, shape = Metric)) +
      scale_shape_manual(values = c(MetricA = 4, MetricB = 1)) +
      theme(plot.margin=grid::unit(c(0,0,0,0), "mm")) +
      coord_sf(xlim = c(-40, 60), ylim = c(30, 90)) +
      ggtitle("Europe") +
      xlab('Longitude') + ylab('Latitude')
    

    【讨论】:

    • 我试过你的代码,但我得到这个错误:grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : 多边形边未找到是什么我做错了吗?我按原样使用它。
    • 我在这个网站上发现,由于这个错误,我必须关闭并重新打开 R。关闭它并重新打开 R 后,它可以工作,但是当我再次运行它时,我得到了同样的错误。有没有办法解决这个问题,这样我就不必每次制作地图时都关闭 R 并重新打开? community.rstudio.com/t/…
    • 嗨丽芙。正如我所说,我无法重现此错误。如果重新启动不能解决问题,您应该尝试按照您添加为链接的帖子中的建议更新您的软件包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多