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

8

我在协调绘图中不同元素的大小方面遇到了一些问题。具体而言,我希望注释的大小与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")))

看这里

怎么回事?

1个回答

12

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

fontsize = data$size * .pt

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

.pt
#> [1] 2.845276

由于某种原因,即使element_text最终也使用grid::textGrob(通过ggplot2::: title_spec),但此缩放不适用于element_text中的size参数。我可能只是没有意识到这个好理由。
无论如何,关键是如果您希望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软件包(版本为v0.3.0)于2020年11月30日创建的。


非常感谢! - Mathematicus728

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接