当我通过美学提供其值时,无法使 geom_sf 线宽正常工作

Joh*_*moe 6 r ggplot2

我有一个形状文件,my_sf. 如果我写:

ggplot() +
  geom_sf(
    data = my_sf,
    size = 0.5 # this is the default value actually
  )
Run Code Online (Sandbox Code Playgroud)

然后就可以正常工作了。但是,如果我my_line_width向 中添加一个属性my_sf,并将该列中的每个值设置为 0.5,然后写入:

ggplot() +
  geom_sf(
    data = my_sf,
    aes(size = my_line_width)
  )
Run Code Online (Sandbox Code Playgroud)

然后我得到一堆巨大的线条,它们可怕地重叠。如果正常线条的宽度为 0.5,那么这些线条的宽度可能为 4。我不明白为什么它们不会产生相同的结果(除了图例,我知道只有在您使用美学时才会弹出图例)。有谁知道发生了什么事吗?

我也尝试过使用lwd而不是size. 完全相同的事情发生了:当我只是设置一个静态值时没问题,但是当我尝试通过美学提供值时,就会出错。

Mic*_*ael 8

aes我很确定这与将数据映射到绘图背后的想法有关。例如,请参阅ggplot2 中 aes() 中传递选项与外部传递选项之间的差异美学何时进入 aes() 内部或外部?。使用size或任何内部方式aes将数据映射到美学,以任何方式ggplot都会理解它(更多内容见下文)或外部aes使用恒定值来实际ggplot使用该值。您发现的行为通常适用于 ggplot,而不是特定于geom_sf.

您可以看到,即使使用geom_point

mtcars %>% ggplot(aes(mpg, wt, size=cyl))+geom_point()
k<-4
mtcars %>% ggplot(aes(mpg, wt, size=k))+geom_point()
k<-6
mtcars %>% ggplot(aes(mpg, wt, size=k))+geom_point()
k<-10
mtcars %>% ggplot(aes(mpg, wt, size=k))+geom_point()  
Run Code Online (Sandbox Code Playgroud)

另外,大小的默认处理与 ggplot2 相当令人困惑,IMO:点面积是否不会随着scale_size_continuous的大小而线性增加?。当 aes 内仅提供 1 个值时,线条粗细可能始终为基线默认大小。正如您的评论者指出的那样,您可以使用 调整此行为scale,并且可以在某种程度上使用“身份”,但提供range /sf/answers/809964851/可能会有所帮助。

  • ggplot2 3.4.0 将 `size` 替换为 `linewidth`,因此请确保将来所有看到此内容的人都使用它。https://www.tidyverse.org/blog/2022/11/ggplot2-3-4-0/ (9认同)
  • 附加 `+scale_size_identity()` 通过一些调整解决了这个问题,谢谢。 (3认同)

小智 6

由于我忽略了评论(这一篇这一篇):

在ggplot 3.4版本中linewidth引入了!!

https://www.tidyverse.org/blog/2022/11/ggplot2-3-4-0/#hello-linewidth