ggplot2 中的 size= 和 linewidth= 是如何相关的

问题描述 投票:0回答:1

我不明白

size=
linewidth=
ggplot2
中点、线、文字的关系。下面我试着证明我的困惑。

this tidyverse documentation about aesthetic specifications 中做出以下陈述:

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

由于历史错误,线宽单位大致为0.75mm。 使其正好为 1 毫米将改变大量现有的 情节,所以我们陷入了这个错误。

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

填充部分的大小由size控制, 行程由行程控制。每个都以毫米为单位测量,总计 点的大小是两者之和。

  • re:文本(在“字体大小”子标题下)

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

鉴于这些,似乎所有三个都是以毫米为单位测量的。 [旁注:除非在

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 上问过同样的问题,但只收到一个回复,这确实无助于减轻我的困惑。

r ggplot2
1个回答
0
投票

可能是一个错误。或者这是故意的,我错过了什么。

我看过

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
  )

© www.soinside.com 2019 - 2024. All rights reserved.