Аннотировать ggplot2 по нескольким аспектам

Недавно я начал использовать функцию facet_nested из пакета ggh4x, и мне очень нравится внешний вид вложенной оси. Я хотел бы аннотировать сюжет, чтобы показать статистику, которую я запустил. Я создал фиктивный набор данных, чтобы проиллюстрировать свою проблему.

library(tidyverse)
library(markdown)
library(ggtext)
library(ggh4x)


df <- data.frame(pretreatment = c("10NA", "10NA","10NA", "NT", "NT", "NT"),
                 timepoint = c("0 h", "6 h","6 h", "0 h", "6 h", "6 h"),
                 treatment = c("baseline", "10NA", "NT","baseline", "10NA", "NT"),
                 mean_copy_no = c(1000, 1500, 1200, 600, 700, 400), 
                 sample_id = c(1, 2, 3, 4, 5, 6))

df %>%
  ggplot(aes(x=sample_id, y = mean_copy_no, fill = treatment)) +
  geom_col(colour = "black") +
  facet_nested(.~ pretreatment + timepoint + treatment, scales = "free", nest_line = TRUE, switch = "x") +
  ylim(0,2000) +
  theme_bw() +
  theme(strip.text.x = element_text(size = unit(10, "pt")),
        legend.position = "none",
        axis.title.y = element_markdown(size = unit(13, "pt")),
        axis.text.y = element_text(size = 11),
        axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x = element_blank(),
        strip.text = element_markdown(size = unit(12, "pt")),
        strip.background = element_blank(),
        panel.spacing.x = unit(0.05,"line"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.border = element_blank())

Это генерирует следующий сюжет. Аннотировать ggplot2 по нескольким аспектам

Теперь моя проблема в том, что каждый из баров расположен в пределах своей грани, а не все на одной оси x (если запустить код без темы, он показывает это более четко).

Я нарисовал, как я хотел бы, чтобы сюжет выглядел. Аннотировать ggplot2 по нескольким аспектам

Я хотел бы добавить линии и звезды, чтобы указать существенные различия.

Я могу легко добавить звезды, однако я изо всех сил пытаюсь добавить линии, и я понимаю, что это может быть даже невозможно, потому что я использую грани для создания сюжета. Я просто хотел опубликовать вопрос и посмотреть, есть ли у кого-нибудь предложения о том, как это сделать в R. Или есть ли способ добиться вложенного вида без использования фасетов.

* Отредактировано для ясности.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Один из вариантов — использовать cowplot после создания объекта ggplot, куда мы можем добавить линии и текст.

library(ggplot2)
library(cowplot)

results <- df %>%
  ggplot(aes(x=sample_id, y = mean_copy_no, fill = treatment)) +
  geom_col(colour = "black") +
  facet_nested(.~ pretreatment + timepoint + treatment, scales = "free", nest_line = TRUE, switch = "x") +
  ylim(0,2000) +
  theme_bw() +
  theme(strip.text.x = element_text(size = unit(10, "pt")),
        legend.position = "none",
        axis.title.y = element_markdown(size = unit(13, "pt")),
        axis.text.y = element_text(size = 11),
        axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x = element_blank(),
        strip.text = element_markdown(size = unit(12, "pt")),
        strip.background = element_blank(),
        panel.spacing.x = unit(0.05,"line"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.border = element_blank())


ggdraw(results) +
  draw_line(
    x = c(0.07, 0.36),
    y = c(0.84, 0.84),
    color = "black", size = 1
  ) +
  annotate("text", x = 0.215, y = 0.85, label = "*", size = 15) +
  draw_line(
    x = c(0.7, 0.98),
    y = c(0.55, 0.55),
    color = "black", size = 1
  ) +
  annotate("text", x = 0.84, y = 0.56, label = "**", size = 15)

Выход

Большое спасибо! Это именно то, что я искал! У меня есть один вопрос, как вы определяете координаты x и y для линий и звезд? Есть ли способ узнать или это просто метод проб и ошибок?

ricarda_st 07.05.2022 14:07

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