ggplot:annotate() 的大小与 element_text() 的大小

Mat*_*728 8 r font-size ggplot2

我在协调情节中不同元素的大小方面遇到了一些麻烦。具体来说,我希望注释的大小与 y 轴标题的大小相同。

然而,以下代码会产生不同的大小:

library(ggplot2)
test_data <- data.frame(x = c(1), y = c(1))
ggplot(test_data) +
  geom_point(aes(x = x, y = y)) +
  theme_bw(base_size = 14) +
  annotate("text", label = "A", x = 0.975, y = 1.025, size = unit(14, "pt")) +
  ylab("Why not the same size?") +
  theme(axis.title.y = element_text(size = unit(14, "pt")))
Run Code Online (Sandbox Code Playgroud)

看这里

是什么赋予了?

All*_*ron 13

annotate实际上只是创建一个新geom_text层。如果你查看源码,GeomText$draw_panel你会发现图层中绘制的文本geom_text最终是由 绘制的grid::textGrob,其字体大小由表达式决定:

fontsize = data$size * .pt
Run Code Online (Sandbox Code Playgroud)

我们可以看到size参数被(隐藏的)全局变量自动放大.pt.pt如果您在控制台中键入,您可以看到值:

fontsize = data$size * .pt
Run Code Online (Sandbox Code Playgroud)

由于某种原因,此缩放不会应用于size中的参数element_text,即使element_text最终也使用grid::textGrob(通过ggplot2:::title_spec)。这可能有一个我不知道的充分理由。

无论如何,底线是,如果您希望 a geom_text(或扩展为 an annotation("text"))的大小与 an 的大小匹配element_text,则可以将注释的大小除以.pt或将大小乘element_text.pt

.pt
#> [1] 2.845276
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2020 年 11 月 30 日创建