При создании графиков с помощью ggplot2
как я могу обернуть текст заголовка, чтобы он соответствовал полям, которые относятся ко всей ширине графика?
library(ggplot2)
library(stringr)
my_title <- c("reltively long sentences that normally isn't appropriate as a title but it is what it is")
ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
geom_boxplot() +
labs(title = my_title) +
theme(plot.title = element_text(hjust = 0.5))
Можно ли этого достичь?
Конечно, извините за неясность. (1) Для меня важно, чтобы поля (правое и левое) были одинаковой длины (от каждого края). Ваш ответ ниже великолепен, но здесь вы можете видеть, что поля не равны: i.stack.imgur.com/ShzQw.png. (2) Как только проблема (1) решена, мне настоятельно необходимо указать длину полей в процентах. Здесь в посте я привел пример 25%, но, надеюсь, я мог просто установить число и настроить поля.
Спасибо, это помогает. Что касается проблемы (2), вы можете изменить аргумент width = unit(x, "npc")
в моем ответе ниже на x = 1 - 2 * desired_fraction
. Что касается (1), кроме использования plot.title.position
, упомянутого в комментарии, я не думаю, что существуют точные пакеты для формирования текста, которые могли бы регулировать расстояние между буквами, чтобы строка занимала точную ширину. Это также сложно в MS Word или Adobe InDesign.
Конечно, это разумно, я не ожидаю, что буквы будут располагаться так, чтобы они соответствовали полям. Я просто хочу, чтобы слово переходило на следующую строку (т. е. переносило текст), если оно переопределяет поле. Но даже с plot.title.position = "plot"
кажется, что он не имеет одинаковой длины на полях (от краев сюжета). Я прокомментировал ваш ответ.
Не на 100% удовлетворительный ответ на вопрос, но он все же может быть полезен. Вместо выравнивания по всей ширине графика мы можем выровнять по ширине панели с помощью ggtext::element_textbox()
. Вы можете варьировать аргумент margin
в зависимости от размера заголовка, unit(15, "pt")
, похоже, работает в этом конкретном случае.
library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.0.2
library(ggtext)
#> Warning: package 'ggtext' was built under R version 4.0.3
my_title <- c("reltively long sentences that normally isn't appropriate as a title but it is what it is")
ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
geom_boxplot() +
labs(title = my_title) +
theme(
plot.title = element_textbox(hjust = 0.5,
width = unit(0.5, "npc"),
margin = margin(b = 15))
)
Created on 2020-12-25 by the reprex package (v0.3.0)
Обновлено: Пример с plot.title.position = "plot"
. Если вы установите element_textbox(..., halign = 0.5)
, то расстояния от текста до границ будут одинаковыми, но при этом текст будет выровнен по центру.
ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
geom_boxplot() +
labs(title = my_title) +
theme(
plot.title = element_textbox(hjust = 0.5,
width = unit(0.5, "npc"),
margin = margin(b = 15)),
plot.title.position = "plot"
)
Created on 2020-12-28 by the reprex package (v0.3.0)
Обратите внимание, что вы также можете использовать этот метод для выравнивания по всей ширине, установив plot.title.position = "plot"
в теме.
Не могли бы вы привести пример кода и графика для использования этого с plot.title.position = "plot"
? Следуя вашему совету, я попытался запустить такой код, но он, похоже, не имеет одинаковой длины полей.
Спасибо за редактирование. Да, наличие halign = 0.5
центрирует текст и сохраняет равные поля, и это действительно то, что я искал!
@Emman, если teunbrand ответил на твой вопрос, ты должен отметить его как лучший ответ. Это даст им кредит на предоставление правильного ответа и поможет другим с той же проблемой знать, что есть правильный ответ на этот вопрос.
Могу я спросить, что именно вы имеете в виду, когда говорите, что хотите решить проблему более точным способом?