我不理解 中的点、线和文本之间size=的linewidth=关系ggplot2。下面我尝试展示我的困惑。
在这份关于美学规范的 tidyverse 文档中,做出了以下声明:
\n\n\n由于历史错误,线宽单位大约为 0.75 毫米。\n将其精确设置为 1 毫米会改变大量现有\n绘图,因此我们\xe2\x80\x99 陷入了这个错误。
\n
\n\n填充部分的大小由size控制,描边的大小由strike控制。每个点的测量单位为毫米,点的总大小为两者之和。
\n
\n\n文本大小以毫米为单位测量。这是不寻常的,但可以使文本的大小与线和点的大小保持一致。
\n
考虑到这些,似乎所有三个都是以毫米为单位测量的。[旁注:除了在单位为 pts 的情况下size=使用时。] 我对这种语言的解释是,对于相同的文本和点(实际上+ )应该具有相同的大小,但由于“历史错误。”element_text()size=linewidth=size=stroke=
然而,我下面的实验并不支持这一点。
\nggplot() +\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()\nRun Code Online (Sandbox Code Playgroud)\n\n看起来 ...
\nsize=)和绿色点(只是stroke=)的大小不同......鉴于size=+stroke=给出了点的“大小”,我希望它们相等。想知道我在这里缺少什么吗?谢谢。
\nps,我确实在Posit Community上问过同样的问题,但只收到一个回复,这确实无助于减轻我的困惑。
\n可能是一个错误。或者这是故意的,我错过了一些东西。
我已经看过了GeomPoint$draw_panel。对于pointsGrob和fontsize的lwd符号给出/计算为
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)