我不明白
size=
和linewidth=
在ggplot2
中点、线、文字的关系。下面我试着证明我的困惑。
在 this tidyverse documentation about aesthetic specifications 中做出以下陈述:
由于历史错误,线宽单位大致为0.75mm。 使其正好为 1 毫米将改变大量现有的 情节,所以我们陷入了这个错误。
填充部分的大小由size控制, 行程由行程控制。每个都以毫米为单位测量,总计 点的大小是两者之和。
文字大小以毫米为单位。这是不寻常的,但使 文本大小与线和点的大小一致。
鉴于这些,似乎所有三个都是以毫米为单位测量的。 [旁注:除非在
size=
中使用 element_text()
,其中单位是 pts。]我对这种语言的解释是,对于相同的 size=
和 linewidth=
,文本和点(实际上是 size=
+ stroke=
) 应该是相同的大小,但由于“历史错误”,线条会更小。
但是我下面的实验不支持这个
ggplot() +
geom_hline(yintercept=1,linewidth=20) +
geom_text(data=data.frame(x=0.5,y=1,label="Text"),
mapping=aes(x=x,y=y,label=label),
size=20,color="red") +
geom_point(data=data.frame(x=0.4,y=1),mapping=aes(x=x,y=y),
pch=21,size=10,stroke=10,fill="red",color="blue") +
geom_point(data=data.frame(x=0.6,y=1),mapping=aes(x=x,y=y),
pch=21,size=20,stroke=0,fill="orange") +
geom_point(data=data.frame(x=0.7,y=1),mapping=aes(x=x,y=y),
pch=21,size=0,stroke=20,color="green") +
geom_point(data=data.frame(x=0.8,y=1),mapping=aes(x=x,y=y),
pch=21,size=10,stroke=10*0.75,fill="orange",color="green") +
scale_x_continuous(limit=c(0.35,0.85)) +
theme_void()
好像...
size=
)和绿色点(只是stroke=
)大小不一样......我希望它们相等,因为size=
+stroke=
给出了点的“大小” .关于我在这里缺少什么的想法?谢谢。
p.s.,我确实在 Posit Community 上问过同样的问题,但只收到一个回复,这确实无助于减轻我的困惑。
可能是一个错误。或者这是故意的,我错过了什么。
我看过
GeomPoint$draw_panel
。对于pointsGrob
,符号的fontsize
和lwd
给出/计算为
fontsize = coords$size * .pt + stroke_size * .stroke/2
lwd = coords$stroke * .stroke/2
哪里
.pt = 2.845276
而.stroke = 3.779528
。因此,对 size
和 stroke
应用了不同的转换,恕我直言,这就是为什么点的大小没有添加到 size+stroke
的原因,如 docs 中所述,即使这对于小点大小几乎不可见.
这也可以通过向笔画添加校正因子来“确认”,即乘以
.pt / .stroke
:
dat <- data.frame(
x = c(.4, .6, .7, .8),
size = c(10, 20, 0, 10),
stroke = c(10, 0, 20, 10),
fill = c("red", "orange", "black", "orange"),
color = c("blue", "black", "green", "green")
)
library(ggplot2)
p <- ggplot() +
geom_hline(yintercept = c("Without correction", "With correction"), linewidth = 20) +
scale_fill_identity(aesthetics = c("fill", "color")) +
scale_size_identity() +
scale_x_continuous(limit = c(0.35, 0.85)) +
theme_void() +
theme(axis.text.y = element_text())
p +
geom_point(
data = dat, mapping = aes(
x = x, y = "Without correction",
size = size, stroke = stroke,
fill = fill, color = color
),
pch = 21
) +
geom_point(
data = dat, mapping = aes(
x = x, y = "With correction",
size = size, stroke = stroke * .pt / .stroke,
fill = fill, color = color
),
pch = 21
)