Ggplot: как обернуть текст заголовка в соответствии с полями, которые относятся к ширине графика

При создании графиков с помощью 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))

Я ищу, чтобы получить что-то вроде этого

Можно ли этого достичь?

Могу я спросить, что именно вы имеете в виду, когда говорите, что хотите решить проблему более точным способом?

teunbrand 27.12.2020 23:42

Конечно, извините за неясность. (1) Для меня важно, чтобы поля (правое и левое) были одинаковой длины (от каждого края). Ваш ответ ниже великолепен, но здесь вы можете видеть, что поля не равны: i.stack.imgur.com/ShzQw.png. (2) Как только проблема (1) решена, мне настоятельно необходимо указать длину полей в процентах. Здесь в посте я привел пример 25%, но, надеюсь, я мог просто установить число и настроить поля.

Emman 28.12.2020 08:18

Спасибо, это помогает. Что касается проблемы (2), вы можете изменить аргумент width = unit(x, "npc") в моем ответе ниже на x = 1 - 2 * desired_fraction. Что касается (1), кроме использования plot.title.position, упомянутого в комментарии, я не думаю, что существуют точные пакеты для формирования текста, которые могли бы регулировать расстояние между буквами, чтобы строка занимала точную ширину. Это также сложно в MS Word или Adobe InDesign.

teunbrand 28.12.2020 10:57

Конечно, это разумно, я не ожидаю, что буквы будут располагаться так, чтобы они соответствовали полям. Я просто хочу, чтобы слово переходило на следующую строку (т. е. переносило текст), если оно переопределяет поле. Но даже с plot.title.position = "plot" кажется, что он не имеет одинаковой длины на полях (от краев сюжета). Я прокомментировал ваш ответ.

Emman 28.12.2020 11:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
1 241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не на 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" в теме.

teunbrand 25.12.2020 01:49

Не могли бы вы привести пример кода и графика для использования этого с plot.title.position = "plot"? Следуя вашему совету, я попытался запустить такой код, но он, похоже, не имеет одинаковой длины полей.

Emman 28.12.2020 11:29

Спасибо за редактирование. Да, наличие halign = 0.5 центрирует текст и сохраняет равные поля, и это действительно то, что я искал!

Emman 29.12.2020 08:01

@Emman, если teunbrand ответил на твой вопрос, ты должен отметить его как лучший ответ. Это даст им кредит на предоставление правильного ответа и поможет другим с той же проблемой знать, что есть правильный ответ на этот вопрос.

AColeman 29.12.2020 17:32

Другие вопросы по теме