Вопрос или проблема
У меня возникли проблемы с отображением точек интереса на моем ggplot. Когда я выбираю свои гены в geom_label_repel(), у меня появляется только 3, хотя я знаю, что в списке есть 57.
fig1. Вот что я получаю при запуске geom_label_repel
Я пробовал изменить 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()
Ответ или решение
Чтобы правильно отображать значимые точки на вулканическом графике с помощью ggplot2
и ggrepel
, необходимо учесть несколько важных аспектов. Я рассмотрю основные шаги для решения вашей проблемы, включая изменение параметров, чтобы обеспечить правильное отображение всех 57 генов вместо только 3, как это происходило у вас ранее. Также я дам рекомендации по улучшению читаемости вашего графика с использованием geom_label_repel()
.
Шаги для решения проблемы
-
Проверка формата данных: Убедитесь, что ваши данные корректно загружены и все нужные колонки присутствуют в
results_df
. Например, наличие колонокpadj
,log2FoldChange
иGene
критично для корректной работы графика. -
Фильтрация генов для меток: Убедитесь, что ваша переменная
genes_to_label
корректно определена. Например:genes_to_label <- unique(results_df$Gene[results_df$padj < custom_alpha])
Это обеспечит то, что вы взяли все гены, помимо расцветки, которые соответствуют вашему критерию значимости.
-
Настройка
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 )
- Увеличьте параметр
-
Использование альтернативных подходов к меткам: Чтобы избежать перегрузки графика, можно использовать
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 )
-
Создание графика: Вот обновленный код с учетом вышеописанных рекомендаций:
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
, чтобы найти оптимальный вариант для ваших данных. Помните, что визуализация данных — это искусство, и иногда требуется немного творчества, чтобы достичь наилучших результатов.