ggplot2 中 size= 和 linewidth= 有何关系

D O*_*gle 6 r ggplot2

我不理解 中的点、线和文本之间size=linewidth=关系ggplot2。下面我尝试展示我的困惑。

\n

这份关于美学规范的 tidyverse 文档中,做出了以下声明:

\n
    \n
  • 回复:线条(在“线宽”小标题下)。
  • \n
\n
\n

由于历史错误,线宽单位大约为 0.75 毫米。\n将其精确设置为 1 毫米会改变大量现有\n绘图,因此我们\xe2\x80\x99 陷入了这个错误。

\n
\n
    \n
  • 回复:点(在“颜色和填充”小标题下)
  • \n
\n
\n

填充部分的大小由size控制,描边的大小由strike控制。每个点的测量单位为毫米,点的总大小为两者之和。

\n
\n
    \n
  • 回复:文本(在“字体大小”小标题下)
  • \n
\n
\n

文本大小以毫米为单位测量。这是不寻常的,但可以使文本的大小与线和点的大小保持一致。

\n
\n

考虑到这些,似乎所有三个都是以毫米为单位测量的。[旁注:除了在单位为 pts 的情况下size=使用时。] 我对这种语言的解释是,对于相同的文本和点(实际上+ )应该具有相同的大小,但由于“历史错误。”element_text()size=linewidth=size=stroke=

\n

然而,我下面的实验并不支持这一点。

\n
ggplot() +\n  geom_hline(yintercept=1,linewidth=20) +\n  geom_text(data=data.frame(x=0.5,y=1,label="Text"),\n            mapping=aes(x=x,y=y,label=label),\n            size=20,color="red") +\n  geom_point(data=data.frame(x=0.4,y=1),mapping=aes(x=x,y=y),\n             pch=21,size=10,stroke=10,fill="red",color="blue") +\n  geom_point(data=data.frame(x=0.6,y=1),mapping=aes(x=x,y=y),\n             pch=21,size=20,stroke=0,fill="orange") +\n  geom_point(data=data.frame(x=0.7,y=1),mapping=aes(x=x,y=y),\n             pch=21,size=0,stroke=20,color="green") +\n  geom_point(data=data.frame(x=0.8,y=1),mapping=aes(x=x,y=y),\n             pch=21,size=10,stroke=10*0.75,fill="orange",color="green") +\n  scale_x_continuous(limit=c(0.35,0.85)) +\n  theme_void()\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

看起来 ...

\n
    \n
  • 我的文字和线条高度相同...我预计线条会更小。
  • \n
  • 我的蓝色和红色点比线条和文本大......我希望它与文本相同。
  • \n
  • 我的橙色点(只是size=)和绿色点(只是stroke=)的大小不同......鉴于size=+stroke=给出了点的“大小”,我希望它们相等。
  • \n
  • 我的橙色和绿色点等于橙色点(不确定我在这里期望什么)。
  • \n
\n

想知道我在这里缺少什么吗?谢谢。

\n

ps,我确实在Posit Community上问过同样的问题,但只收到一个回复​​,这确实无助于减轻我的困惑。

\n

ste*_*fan 4

可能是一个错误。或者这是故意的,我错过了一些东西。

我已经看过了GeomPoint$draw_panel。对于pointsGrobfontsizelwd符号给出/计算为

fontsize = coords$size * .pt + stroke_size * .stroke/2
lwd = coords$stroke * .stroke/2
Run Code Online (Sandbox Code Playgroud)

哪里.pt = 2.845276.stroke = 3.779528. size因此,对和进行不同的转换,stroke恕我直言,这就是为什么点的大小不会按照文档size+stroke中所述添加的原因,即使对于小点大小来说这几乎不可见。

这也可以通过向笔画添加校正因子来“确认”,即乘以.pt / .stroke

fontsize = coords$size * .pt + stroke_size * .stroke/2
lwd = coords$stroke * .stroke/2
Run Code Online (Sandbox Code Playgroud)

基于文档中示例的问题的另一个示例:

sizes <- expand.grid(size = seq(0, 30, 3) * 2, stroke = seq(0, 30, 3) * 2) |>
  subset(size + stroke == 30)

ggplot(sizes, aes(x = size, size = size)) +
  geom_hline(yintercept = c("Without correction", "With correction"), colour = "white", linewidth = 30) +
  geom_point(aes(y = "Without correction", stroke = stroke), shape = 21, fill = "red") +
  geom_point(aes(y = "With correction", stroke = stroke * .pt / .stroke), shape = 21, fill = "red") +
  scale_x_continuous(expand = c(.1, 0)) +
  scale_size_identity()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述