【问题标题】:geom_sf size argument doesn't work when size < 1当 size < 1 时 geom_sf 大小参数不起作用
【发布时间】:2018-08-16 03:48:50
【问题描述】:

问题:我正在尝试使用 sf 包和来自 ggplot2 的 geom_sf() 创建美国州/县的地图,但我无法获得多边形边界的 size 参数geom_sf() 中的线宽以在 size &lt; 1 时正确创建细线(例如 ggplot(sf_obj) %&gt;% geom_sf(size = 0.5)

具体来说,一个州/县的边界线从任意小(例如size = 0.05)一直到size = 0.702 似乎具有相同的宽度。然后在size = 0.702 处似乎有一个奇怪的截止点,在该截止点之上边界线突然显得更宽。然后从size = 0.703size = 1 边界线似乎具有相同的宽度。对于size > 1,边界线如预期的那样逐渐变宽。

研究: 似乎geom_sf() 支持size here 和 Matt Strimas-Mackey here 的地图代码所示.看来我的问题可能与 ggplot2 的 Github 页面上引用的 here 相同,标题为“geom_sf 将小尺寸舍入到 1”,但问题已解决,我不确定是否/如何在我的机器。还有另一个类似的问题提交了here(和here),但哈德利建议这种情况下的问题可能是图形设备/查看器。我在 RStudio 和 RGUI 中复制了我的问题(以及上面链接的两个 Github 问题),但我不确定如何测试/更改我的图形设备/查看器。

版本信息:我正在使用 ggplot2_3.0.0、sf_0.6.3、R 版本 3.5.1、RStudio 版本 1.1.456 和 Windows 10 版本 1803;也使用 RGUI 复制了该问题。

代码: 下面是使用来自geom_sf()docs 的北卡罗来纳州地图的reprex。任何帮助,将不胜感激。谢谢!

suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(reprex))
suppressPackageStartupMessages(library(sf))

#################################################

# plot north carolina map
nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
ggplot(nc) + geom_sf(size = 0.05)

nc %>% ggplot() + geom_sf(size = 0.702)

nc %>% ggplot() + geom_sf(size = 0.703)

# get version info
packageVersion("ggplot2")
#> [1] '3.0.0'
packageVersion("sf")
#> [1] '0.6.3'
version
#>                _                           
#> platform       x86_64-w64-mingw32          
#> arch           x86_64                      
#> os             mingw32                     
#> system         x86_64, mingw32             
#> status                                     
#> major          3                           
#> minor          5.1                         
#> year           2018                        
#> month          07                          
#> day            02                          
#> svn rev        74947                       
#> language       R                           
#> version.string R version 3.5.1 (2018-07-02)
#> nickname       Feather Spray

更新:正如 Chris 和 Ibusett 所指出的,在使用 ggsave 后,边框线具有预期的宽度。谢谢!

【问题讨论】:

  • 您是否使用ggsave 输出?我无法在我的机器上重现该错误。
  • 我看到了同样的行为,但我想这真的取决于图形设备。例如,如果您尝试使用ggsave 保存为 pdf,您将得到不同的结果。另外,请考虑在监视器上可以渲染多少“细”线,并且监视器上的线的宽度不可避免地被“量化”(即,它可以是 1 像素或 2 像素,但不是 1.5 像素),所以我认为总会有一些“截止点”,你会看到突然的变化。
  • 我投票结束这个问题,因为这是图形设备的问题,而不是编码问题,并且 cmets 已根据 OP 的更新提供了解决方案

标签: r dictionary ggplot2 sf


【解决方案1】:

这个答案只是给不喜欢ggsave所有剧情的人,提供一些技巧。

是的,它确实取决于图形设备。一些图形设备在处理这些事情时非常糟糕(看着你,默认的 Windows 设备)。接下来的 reprex 是使用设置为使用 'ragg' 包渲染绘图的块选项执行的。

#+ setup, include=FALSE
knitr::opts_chunk$set(dev = "ragg_png")

#+ main
library(ggplot2)
library(patchwork)

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
p1 <- ggplot(nc) + geom_sf(size = 0.05) + ggtitle("size = 0.05")
p2 <- ggplot(nc) + geom_sf(size = 0.50) + ggtitle("size = 0.50")
p3 <- ggplot(nc) + geom_sf(size = 1.00) + ggtitle("size = 1.00")
p4 <- ggplot(nc) + geom_sf(size = 2.00) + ggtitle("size = 2.00")

p1 + p2 + p3 + p4

reprex package (v2.0.1) 于 2022-01-14 创建

在 markdown 文件中,您可以通过类似的方式设置默认图形设备。为整个文档全局设置设备:

```{r, include = FALSE}
knitr::opts_chunk$set(
  dev = "ragg_png"
)
```

对于那些使用 RStudio 的人,您可以通过转到“工具 > 全局选项 > 常规 > 图形(选项卡)”来更改默认图形设备

【讨论】:

    猜你喜欢
    • 2017-12-27
    • 2021-04-17
    • 2021-08-28
    • 2020-02-26
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多