【问题标题】:Unexpected behaviour with base plot.sf vs ggplot for sf objects用于 sf 对象的基本 plot.sf 与 ggplot 的意外行为
【发布时间】:2020-06-16 05:36:50
【问题描述】:

背景

我在使用 R 的 sf 对象的基本绘图方法绘制 sf 类对象时遇到了一些异常行为,与 ggplot2 的输出相比,该行为更加异常。

绘图旨在显示POLYGON 特征集合在POINT 特征集合之上的叠加。它们具有一致的 CRS 设置,并且多边形特征的边界框范围完全包围了点集合的边界框。

可重现的例子:

library(sf)
library(geohashTools)
data(meuse, package = "sp")
meuse_sf = st_as_sf(meuse, coords = c("x", "y"), crs = 28992, agr = "constant")
meuse_sf <- st_transform(meuse_sf, crs = st_crs(4326))

meuse_gh <- geohashTools::gh_covering(meuse_sf)

来自geohashToolsgh_covering 函数应该创建一个完全包围meuse_sf 中所有点范围的网格。

这是来自基本地块的地块。请注意,看起来有些点在此网格之外。

plot(meuse_sf[1])
plot(meuse_gh[2], add = TRUE)

起初,这似乎是 gh_covering 中的一个错误,但当在 ggplot2 中重现时,很明显它正在按预期工作

library(ggplot2)
ggplot() +
  geom_sf(data = meuse_sf, aes(colour = cadmium)) +
  geom_sf(data = meuse_gh, fill = NA)

检查

对边界框范围和 CRS 等效性的额外检查恢复正常。

> st_bbox(meuse_sf)
    xmin     ymin     xmax     ymax 
 5.72319 50.95661  5.76304 50.99156 
> st_bbox(meuse_gh)
     xmin      ymin      xmax      ymax 
 5.712891 50.954590  5.767822 50.998535 

> st_crs(meuse_gh)==st_crs(meuse_sf)
[1] TRUE

问题

那么,是什么导致了基图行为的问题?

会话信息

> sessionInfo()
R version 4.0.0 (2020-04-24)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Mojave 10.14.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_3.3.0      sf_0.9-3           geohashTools_0.3.0 sp_1.4-1   

【问题讨论】:

    标签: r ggplot2 sf sp


    【解决方案1】:

    在你的第一个绘图命令中,你需要使用

    plot(meuse_sf[1], reset = FALSE)
    

    当您想稍后添加元素时。

    【讨论】:

    • 谢谢@Edzer。这解决了为什么有时没有出现过度绘图的原因。但我仍然不确定位置错误,为什么在我的问题中 geohash 对象没有正确覆盖在点对象上。我找到了一种通过连续调用在干净的会话环境中更可靠地复制此错误的方法。 plot(meuse_sf[1]) 然后plot(meuse_gh[2]) 然后plot(meuse_sf[1]) 然后plot(meuse_gh[2], add = TRUE)。这会产生如上图所示的重叠图。我猜这与图形设备有关?
    • 问问geohashTools包的作者怎么样?
    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多