ggplot: размер аннотации () в зависимости от размера element_text()

#r #ggplot2 #font-size

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

Смотрите здесь

Что дает?

Ответ №1:

annotate фактически просто создает новый geom_text слой. Если вы заглянете в исходный код GeomText$draw_panel , вы увидите, что текст, нарисованный в geom_text слое, в конечном итоге рисуется grid::textGrob , а его размер шрифта определяется выражением:

 fontsize = data$size * .pt
 

где мы можем видеть size , что параметр автоматически масштабируется (скрытой) глобальной переменной .pt . Вы можете увидеть значение .pt , если вы введете в своей консоли:

 .pt
#> [1] 2.845276
 

По какой-то причине это масштабирование не применяется к size параметру in element_text , хотя element_text в конечном итоге также используется grid::textGrob (via ggplot2:::title_spec ) . Вероятно, для этого есть веская причина, о которой я просто не знаю.

В любом случае, суть в том, что если вы хотите, чтобы размер a geom_text (или, по расширению, an annotation("text") ) соответствовал размеру an 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))
 

Создано 2020-11-30 пакетом reprex (версия 0.3.0)

Комментарии:

1. Большое вам спасибо!