#r #ggplot2 #heatmap
#r #ggplot2 #тепловая карта
Вопрос:
Я пытаюсь создать тепловую карту уровня рода для микробного сообщества, идентифицированного в моих образцах.
Проблема
Я хотел добавить итоговые суммы и строки в свою тепловую карту (общее количество всех генов для каждой выборки и общее количество каждого гена для всех выборок). Тем не менее, я изо всех сил пытался работать с кодом, чтобы я мог добавлять итоговые значения без изменения моих данных и моих предыдущих кодов.
Моя попытка обойти :
Я попытался использовать следующие коды для построения моей тепловой карты. Однако результирующий график был странным.
Мой фрейм данных:
Gene Sample1 Sample2 Sample3 Sample4 Sample5 Total
A 0.0186 1.578 3.478 0.0045 0.569 5.648
B 0.0009 0.125 1.254 5.890 1.590 8.8599
C 2.567 0.897 0.0026 1.285 2.648 7.3996
D 10.421 0.743 0.0152 0.479 6.489 18.1472
... ... ... ... ... ... ...
Total 34.49 11.1 11.72 18.19 24.52 100
Мои преобразованные данные:
Gene Sample Abundance
A 1 0.0186
B 1 0.0009
C 1 2.567
D 1 10.421
... ... ...
Мой код:
p1 <- ggplot(data=heatmap,
mapping=aes(x= Sample, y= Gene, fill= Abundance))
geom_tile()
facet_grid (~ Sample, scales = "free", space = "free")
scale_fill_distiller(name = "Relative Abundance (%)", palette = "RdYlGn")
theme(text = element_text(size=12),
axis.text.x = element_blank(),
axis.text.y = element_text(size = 11, colour = "black"),
strip.text.y = element_text(angle = 0),
legend.direction = "horizontal",
legend.position = "bottom")
scale_x_discrete(position = "top")
p2 <- p1 geom_point(data = heatmap, aes(color = Abundance),size = 10, shape = 19)
scale_color_gradient2(low = "red", mid = "white",high = "grey", midpoint = 0)
geom_text(data = heatmap, size = 3, aes(label = round(Abundance,2)))
p2
Результат:
Я ценю любые предложения о том, как я мог бы изменить график для лучшей визуализации, и любые предложения о том, как добавить сумму по горизонтали и вертикали.
Комментарии:
1. Хм. На моей машине ваш код работает нормально. Я получаю красивую тепловую карту с метками, строкой и столбцом с итогами.
2. @stefan Вы получили аналогичный график, который я получил?
3. Нет. После преобразования ваших данных в длительное использование
tidy::pivot_longer
и запуска вашего кода я получаю этот график i.imgur.com/O72GAxp.png4. @stefan Это выглядит так хорошо. не могли бы вы предоставить коды, чтобы я мог лучше понять?
5. @stefan Но я на самом деле хотел разделить общие суммы, чтобы они не влияли на масштаб. Например, этот: i.stack.imgur.com/P5Xbd.jpg . Но я не знал, как манипулировать кодом.
Ответ №1:
Возможно, это то, что вы ищете. На мой взгляд, нет необходимости использовать facet_grid
. Вместо этого вы могли бы отфильтровать данные, используемые для geom_tile
geom_point
слоя и .
library(ggplot2)
library(tidyr)
library(dplyr)
heatmap <- read.table(text = "Gene Sample1 Sample2 Sample3 Sample4 Sample5 Total
A 0.0186 1.578 3.478 0.0045 0.569 5.648
B 0.0009 0.125 1.254 5.890 1.590 8.8599
C 2.567 0.897 0.0026 1.285 2.648 7.3996
D 10.421 0.743 0.0152 0.479 6.489 18.1472
Total 34.49 11.1 11.72 18.19 24.52 100", header = TRUE)
heatmap <- heatmap %>%
pivot_longer(-Gene, names_to = "Sample", values_to = "Abundance")
ggplot(mapping = aes(x = Sample, y = Gene))
geom_tile(data = filter(heatmap, Gene != "Total", Sample != "Total"), aes(fill = Abundance))
geom_point(data = filter(heatmap, Gene == "Total" | Sample == "Total"), aes(color = Abundance), size = 10, shape = 19)
geom_text(data = heatmap, aes(label = round(Abundance, 2)), size = 3)
scale_color_gradient2(low = "red", mid = "white", high = "grey", midpoint = 0)
scale_fill_distiller(name = "Relative Abundance (%)", palette = "RdYlGn")
scale_x_discrete(limits = unique(heatmap$Sample), position = "top")
scale_y_discrete(limits = rev(unique(heatmap$Gene)))
theme_minimal()
theme(
text = element_text(size = 12),
axis.text.y = element_text(size = 11, colour = "black"),
strip.text.y = element_text(angle = 0),
legend.direction = "horizontal",
legend.position = "bottom",
panel.grid.major = element_blank()
)