#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. Большое вам спасибо!