Недавно я начал использовать функцию 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())
Это генерирует следующий сюжет.
Теперь моя проблема в том, что каждый из баров расположен в пределах своей грани, а не все на одной оси x (если запустить код без темы, он показывает это более четко).
Я нарисовал, как я хотел бы, чтобы сюжет выглядел.
Я хотел бы добавить линии и звезды, чтобы указать существенные различия.
Я могу легко добавить звезды, однако я изо всех сил пытаюсь добавить линии, и я понимаю, что это может быть даже невозможно, потому что я использую грани для создания сюжета. Я просто хотел опубликовать вопрос и посмотреть, есть ли у кого-нибудь предложения о том, как это сделать в R. Или есть ли способ добиться вложенного вида без использования фасетов.
* Отредактировано для ясности.
Один из вариантов — использовать 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 для линий и звезд? Есть ли способ узнать или это просто метод проб и ошибок?