R语言 在ggplot2中,大小=和线宽=是如何关联的

0h4hbjxa  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(151)

我不理解ggplot2中的点、线和文本中size=linewidth=之间的关系。下面我尝试演示我的困惑。
this tidyverse关于美学规范的文档中,做了以下陈述:

  • re:lines(在“线宽”副标题下)。

由于历史错误,线宽的单位大约是0.75毫米。精确地将其设置为1毫米将改变大量现有的图,所以我们坚持这个错误。

  • re:points(在“颜色和填充”副标题下)

填充部分的大小由尺寸控制,笔划的大小由笔划控制。每个以mm为单位测量,点的总尺寸为两者之和。

  • re:text(在“字体大小”副标题下)

文本的大小以毫米为单位。这是不常见的,但使文本的大小与线和点的大小一致。
考虑到这些,似乎所有三个都是以mm为单位测量的。[旁注:除了在element_text()中使用size=时,其中单位是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=给出了点的“大小”。
  • 我的橙子和绿点等于橙色点(不确定我在这里期望什么)。

关于我在这里错过了什么的想法?谢谢。
我确实在Posit Community上问了同样的问题,但只收到了一个回复,这真的无助于减轻我的困惑。

7vux5j2d

7vux5j2d1#

可能是窃听器。或者是故意的我漏掉了什么。
我看了一下GeomPoint$draw_panel。对于pointsGrob,符号的fontsizelwd被给定/计算为

fontsize = coords$size * .pt + stroke_size * .stroke/2
lwd = coords$stroke * .stroke/2

其中.pt = 2.845276.stroke = 3.779528。因此,对sizestroke应用了不同的转换,恕我直言,这就是为什么点的大小不会像文档中所述的那样增加到size+stroke,即使对于小的点大小几乎不可见。
这也可以通过将校正因子添加到冲程来“确认”,即通过乘以.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
  )

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

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()

相关问题