ggplot2-Как добавить total к тепловой карте

#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.png

4. @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()
  )