Маркировка конкретных точек на вулканическом графике

Вопрос или проблема

У меня возникли проблемы с отображением точек интереса на моем ggplot. Когда я выбираю свои гены в geom_label_repel(), у меня появляется только 3, хотя я знаю, что в списке есть 57.

fig1. Вот что я получаю при запуске geom_label_repel

fig2. Вот что я получаю с помощью geom_text, но не могу легко прочитать текст на фоне синего. Пытаюсь обвести их в рамку

fig3. Я хочу, чтобы рисунок 2 выглядел так, но показывал гены на рисунке 2 с рамкой вокруг, чтобы сделать чтение легче

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

  results_df$Gene <- rownames(resultsLFC_df)
  
  # создайте именованный вектор символов для цветовой палитры
  palette <- c("Upregulated" = "red",
               "Downregulated" = "blue",
               "Not_significant" = "gray")

  # показать вулканический график
  results_df %>%
    mutate(Expression = if_else(padj < custom_alpha & log2FoldChange > 0, "Upregulated",
                               if_else(padj < custom_alpha & log2FoldChange < 0, "Downregulated", "Not_significant"))) %>%
    ggplot(aes(x = log2FoldChange, y = -log10(padj), color = Expression)) +
    geom_point(alpha = 0.8, size = 0.5) +
    geom_vline(xintercept = 0, linetype = "dashed") +
    geom_hline(yintercept = -log10(custom_alpha), linetype = "dashed") +
    

    geom_text(
      aes(label = ifelse(Gene %in% genes_to_label, as.character(Gene), "")), color = "black",
      arrow = arrow(length = unit(0.02, "npc")),
      box.padding=.5, point.padding=0.5, segment.color="black", show.legend=FALSE, max.overlaps = 10,
      hjust=0,vjust=0) +

    
    # geom_label_repel(
    #   aes(label = if_else(Gene %in% genes_to_label, Gene, "")),
    #   arrow = arrow(length = unit(0.02, "npc")),
    #   box.padding=.1, point.padding=0.5, segment.color="gray70", show.legend=FALSE, max.overlaps = 20
    # ) +
    
    labs(title = condition_contrast, x = "log2(Fold Change)", y = "-log10(padj)") +
    scale_color_manual(values = palette, limits = names(palette))+
    theme_classic()

Я показал и geom_text, и geom_label_repel, поскольку пытался разобраться с ними.

Вот два варианта: первый с использованием geom_text, а второй с использованием ggrepel::geom_label_repel.

С помощью geom_text изменение горизонтального выравнивания текста очень помогает с наложением (я так думаю).

С помощью geom_label_repel вы можете использовать аргументы nudge_x и nudge_y, а также изменить max_overlaps на что-то выше 10. Причина, по которой ваши метки не отображались, вероятно, связана с слишком низким значением max_overlaps. По моему опыту, это отлично работает для отчетов о вулканических графиках, даже если метки не находятся рядом с точкой, которую они описывают, иначе будет много наложений.

set.seed(123)
df <- data.frame(
  padj = runif(1000),
  log2FoldChange = rnorm(1000),
  Gene = paste0("G", 1:1000)
)
palette <- c("Upregulated" = "red",
             "Downregulated" = "blue",
             "Not_significant" = "gray")
custom_alpha = 0.05
df$Expression <- if_else(df$padj < custom_alpha & df$log2FoldChange > 0, "Upregulated",
                         if_else(df$padj < custom_alpha & df$log2FoldChange < 0,
                                 "Downregulated", "Not_significant"))
genes_to_label <- df[df$Expression != "Not_significant", "Gene"]

ggplot(df, aes(x = log2FoldChange, y = -log10(padj), color = Expression)) +
  geom_point(alpha = 0.8, size = 0.5) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  geom_hline(yintercept = -log10(custom_alpha), linetype = "dashed") +
  geom_text(
    data = df[df$Gene %in% genes_to_label,],
    aes(label = Gene), color = "black",
    show.legend=FALSE,
    # варьирование hjust по строкам может помочь сделать это легче для чтения, смещая метки вниз
    # и налево для регуляции вверх. 
    hjust = ifelse(df[df$Gene %in% genes_to_label, "Expression"] == "Upregulated", 0, 1),
      size = 3, vjust = -0.5) +
  labs(title = "geom text", x = "log2(Fold Change)", y = "-log10(padj)") +
  scale_color_manual(values = palette, limits = names(palette))+
  theme_classic()


ggplot(df, aes(x = log2FoldChange, y = -log10(padj), color = Expression)) +
  geom_point(alpha = 0.8, size = 0.5) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  geom_hline(yintercept = -log10(custom_alpha), linetype = "dashed") +
  # здесь вызовы geom_label_repel позволяют бесконечные наложения и подталкивают точки
  # основываясь на регулировании гена (на 3 или -3). Вы также можете просто вызвать geom_label_repel дважды.
  ggrepel::geom_label_repel(
    data = df[df$Gene %in% genes_to_label,],
    aes(label = Gene),
    arrow = arrow(length = unit(0.02, "npc")),
    nudge_x = 3 * ifelse(df[df$Gene %in% genes_to_label, "Expression"] == "Upregulated", 1, -1),
    nudge_y = 1,
    box.padding=.1, point.padding=0.5, segment.color="gray70", show.legend=FALSE, max.overlaps = Inf
  ) +
  labs(title = "condition_contrast", x = "log2(Fold Change)", y = "-log10(padj)") +
  scale_color_manual(values = palette, limits = names(palette))+
  theme_classic()

geom text version
geom label repel version

Ответ или решение

Чтобы правильно отображать значимые точки на вулканическом графике с помощью ggplot2 и ggrepel, необходимо учесть несколько важных аспектов. Я рассмотрю основные шаги для решения вашей проблемы, включая изменение параметров, чтобы обеспечить правильное отображение всех 57 генов вместо только 3, как это происходило у вас ранее. Также я дам рекомендации по улучшению читаемости вашего графика с использованием geom_label_repel().

Шаги для решения проблемы

  1. Проверка формата данных: Убедитесь, что ваши данные корректно загружены и все нужные колонки присутствуют в results_df. Например, наличие колонок padj, log2FoldChange и Gene критично для корректной работы графика.

  2. Фильтрация генов для меток: Убедитесь, что ваша переменная genes_to_label корректно определена. Например:

    genes_to_label <- unique(results_df$Gene[results_df$padj < custom_alpha])

    Это обеспечит то, что вы взяли все гены, помимо расцветки, которые соответствуют вашему критерию значимости.

  3. Настройка geom_label_repel():

    • Увеличьте параметр max.overlaps, чтобы позволить большему количеству меток отображаться. Например, замените его на max.overlaps = Inf.
    • Используйте nudge_x и nudge_y для улучшения читаемости меток. Это поможет избежать наложения меток друг на друга.
    • Параметр box.padding можно увеличить, чтобы пространство между коробкой метки и текстом было больше:
      ggrepel::geom_label_repel(
      aes(label = if_else(Gene %in% genes_to_label, Gene, "")),
      box.padding = 0.5,
      point.padding = 0.3,
      nudge_x = 0.5, 
      nudge_y = 0.5,
      segment.color = "black",
      show.legend = FALSE,
      max.overlaps = Inf
      )
  4. Использование альтернативных подходов к меткам: Чтобы избежать перегрузки графика, можно использовать geom_text() с изменением параметров hjust и vjust, так что метки будут выровнены в зависимости от направления регулирования. Это может помочь в чтении графика:

    geom_text(
       aes(label = ifelse(Gene %in% genes_to_label, as.character(Gene), "")),
       size = 3,
       color = "black",
       nudge_y = ifelse(results_df$Expression == "Upregulated", 0.3, -0.3),
       hjust = ifelse(results_df$Expression == "Upregulated", 0, 1),
       show.legend = FALSE
    )
  5. Создание графика: Вот обновленный код с учетом вышеописанных рекомендаций:

    ggplot(results_df, aes(x = log2FoldChange, y = -log10(padj), color = Expression)) +
       geom_point(alpha = 0.8, size = 0.5) +
       geom_vline(xintercept = 0, linetype = "dashed") +
       geom_hline(yintercept = -log10(custom_alpha), linetype = "dashed") +
       ggrepel::geom_label_repel(
           aes(label = if_else(Gene %in% genes_to_label, Gene, "")),
           box.padding = 0.5,
           point.padding = 0.3,
           nudge_x = 0.5,
           nudge_y = 0.5,
           segment.color = "black",
           show.legend = FALSE,
           max.overlaps = Inf
       ) +
       labs(title = condition_contrast, x = "log2(Fold Change)", y = "-log10(padj)") +
       scale_color_manual(values = palette, limits = names(palette)) +
       theme_classic()

Заключение

Следуя данным рекомендациям, вы должны быть в состоянии эффективно отображать все ваши гены с метками, улучшая при этом читаемость графика. Не бойтесь экспериментировать с различными значениями nudge_x, nudge_y и box.padding, чтобы найти оптимальный вариант для ваших данных. Помните, что визуализация данных — это искусство, и иногда требуется немного творчества, чтобы достичь наилучших результатов.

Оцените материал
Добавить комментарий

Капча загружается...