R: Как мне получить ggplot2 :: geom_text (), чтобы вставить разрыв строки вместе с другим форматированным текстом? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь поместить аннотацию в граненый блокпост, используя метод, описанный в верхнем ответе на этот вопрос: Аннотирование текста на отдельном фасете в ggplot2

И форматирование текста с использованием методовподнял здесь: https://ggplot2.tidyverse.org/reference/annotate.html

Я не могу понять, почему geom_text() не вставит разрыв строки в мой код, где я поместил \n. Вот упрощенная версия:

p.data <- data.frame(Main = rep("Ratio", 100),
                     CAT = c('A','B','C','D'),
                     value = rnorm(100, mean = 1.5, sd = 1.5))
p.text <- data.frame(Main = "Ratio",
                     CAT = 'B',
                     value = 7,
                     lab = "Text")
p <-  ggplot(data = p.data, aes(x = CAT, y = value, fill = CAT)) +
      geom_boxplot() +
      scale_y_continuous(breaks = c(0:6), limits = c(0,8)) +
      facet_wrap(~ Main, scales = 'fixed', nrow = 1, ncol = 1) +
      geom_text(data = p.text, hjust = 0, parse = TRUE,
                label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\", \n bold(MDD): n.s.)")
p

enter image description here

Среди других глупостей я пробовал:

label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\", \n bold(MDD): n.s.)"
label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\", \n, bold(MDD): n.s.)"
label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\", \"\n\", bold(MDD): n.s.)"
label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\", \"\n bold(MDD): n.s.\")"
label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\"\n, bold(MDD): n.s.)"

.. .но ничего не сработало.

В случае, если не очевидно, что мне нужны результаты CMV в одной строке и результаты MDD в другой строке с сохранением жирных шрифтов и надстрочного знака "2". Мой последний график будет состоять из одного графика с одним фасетом и одного с тремя фасетами, соединенными вместе с помощью grid.arrange(), но мой пример - только один граф.

Спасибо

1 Ответ

0 голосов
/ 15 октября 2019

Существует несколько вариантов решения проблемы:

@ eipi10 предлагает в комментарии выше использовать atop():

p.data <- data.frame(Main = rep("Ratio", 100),
                 CAT = c('A','B','C','D'),
                 value = rnorm(100, mean = 1.5, sd = 1.5))
p.text <- data.frame(Main = "Ratio",
                 CAT = 'B',
                 value = 7,
                 lab = "Text")
p <- ggplot(data = p.data, aes(x = CAT, y = value, fill = CAT)) +
     geom_boxplot() +
     scale_y_continuous(breaks = c(0:6), limits = c(0,8)) +
     facet_wrap(~ Main, scales = 'fixed', nrow = 1, ncol = 1) +
     geom_text(data = p.text, hjust = 0, parse = TRUE,
               label = "atop(paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\"), 
                             bold(MDD): n.s.)")
p

enter image description here

Тем не менее, я привередлив в форматировании и хотел бы, чтобы обе строки были выровнены по левому краю. Итак, я просто создам еще одну строку во фрейме данных p.text с меньшим значением, чтобы разместить еще один geom_text:

p.text <- data.frame(Main = "Ratio",
                     CAT = 'B',
                     value = c(7, 6),
                     lab = "Text")
p <- ggplot(data = p.data, aes(x = CAT, y = value, fill = CAT)) +
  geom_boxplot() +
  scale_y_continuous(breaks = c(0:6), limits = c(0,8)) +
  facet_wrap(~ Main, scales = 'fixed', nrow = 1, ncol = 1) +
  geom_text(data = p.text[1,], hjust = 0, parse = TRUE,
            label = "paste(bold(CMV): f ^ 2, \" = 0.04, p = 0.003\")") +
  geom_text(data = p.text[2,], hjust = 0, parse = TRUE,
            label = "paste(bold(MDD): n.s.)")
p

enter image description here

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

...