geom_sf的大小参数在size < 1时无效。

16

问题:我正在尝试使用sf包和ggplot2中的geom_sf()创建美国州/县地图,但是当size < 1(例如ggplot(sf_obj)%>% geom_sf(size = 0.5))时,我无法使geom_sf() 的多边形边界线宽度的size参数正确创建细线。

具体来说,一个州/县的边界线似乎从任意小的值(例如size = 0.05)到size = 0.702都有相同的宽度。然后,在size = 0.702处出现奇怪的截止点,超过此值时,边界线突然变粗。然后从size = 0.703size = 1,边界线似乎有相同的宽度。对于size> 1,边界线会逐渐变粗,就像预期的那样。

研究:看起来geom_sf()支持size<1的渐进变化,如Bob Rudis这里和Matt Strimas-Mackey这里的地图代码所示。似乎我的问题可能与ggplot2的Github页面上标题为“ geom_sf将小尺寸四舍五入到1”的问题相同这里,但该问题已关闭,我不确定如何在我的机器上实现修复。还有另一个类似的问题(以及这里),但是Hadley表示,在这种情况下,问题可能是图形设备/查看器。我在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之后,边框线具有预期的宽度。 谢谢!

输入图像描述


3
你使用 ggsave 输出了吗?在我的电脑上无法复现这个错误。 - Chris
3
我看到了相同的行为,但我猜这实际上取决于图形设备。例如,如果您尝试使用ggsave保存为pdf,您将会得到不同的结果。此外,请注意,在您的显示器上可以呈现出多么“细”的线条有一个限制,并且线条在显示器上的宽度无法避免地“量子化”(即它可以是1个像素或2个像素,但不能是1.5个像素),因此我认为一定会存在一些“截止点”,您会看到突然的变化。 - lbusett
2
我投票关闭此问题,因为这是一个图形设备问题,而不是编码问题,评论已经提供了一个解决方案,根据OP的更新。 - tjebo
1个回答

3
这个答案适用于不喜欢将所有图形保存为ggsave的人,提供一些技巧。
是的,它确实取决于图形设备。有些图形设备在处理这些内容时非常糟糕(看着你,默认的Windows设备)。下面的示例使用chunk选项设置为使用'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年1月14日创建

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

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

对于那些在使用RStudio的人,你可以通过进入“工具 > 全局选项 > 通用 > 图形(选项卡)”来更改默认的图形设备。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接