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

ggplot: size of annotate() vs size of element_text()

我在协调情节中不同元素的大小时遇到​​了一些麻烦。具体来说,我希望注释的大小与 y-axis.

的标题大小相同

但是以下代码会产生不同的大小:

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

什么给了?

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

fontsize = data$size * .pt

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

,您可以看到 .pt 的值
.pt
#> [1] 2.845276

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

无论如何,最重要的是,如果您希望 geom_text(或者推而广之,annotation("text"))的大小与 element_text 的大小相匹配,您, 将注释的大小除以 .pt 或将 element_text 的大小乘以 .pt:

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 = "Now the same size", x = 0.975, y = 1, 
           angle = 90, size = 14/.pt) +
  ylab("Now the same size") +
  theme(axis.title.y = element_text(size = 14))

reprex package (v0.3.0)

于 2020-11-30 创建