Добавьте пробел черного цвета или линию границы в тепловую карту с помощью пакета featmap

#r #heatmap

Вопрос:

Вот мой код R ниже. Теперь есть два белых пробела по команде gaps_col = c(2,4). Я хотел бы изменить белый пробел на черный или добавить черную линию границы в месте разрыва. Как я могу это сделать?

Более того, я также хотел бы изменить имена колонок. Я хотел бы заменить P1 и P2 на P в середине P1 и P2. Я хотел бы заменить Q1 и Q2 на Q в середине Q1 и Q2. Я хотел бы заменить T1 и T2 на T в середине T1 и T2.

 library(pheatmap)   
set.seed(123)
df<-data.frame( matrix(sample(30), ncol = 5))
colnames(df)<-LETTERS[1:5]
subj<-c("P1", "P2","Q1", "Q2", "T1","T2")
rownames(df)<-subj
aka2 = data.frame(ID = factor(rep(c("Pat","Trea"), each=3)))
rownames(aka2)<-subj
aka3 = list(ID = c(Pat = "white", Trea="blue"))
pheatmap(t(scale(df)),
         annotation_col = aka2, 
         annotation_colors = aka3[1],
         annotation_legend = FALSE,
         gaps_col =  c(2,4),
         show_colnames = T, show_rownames = T, cluster_rows = F, 
         cluster_cols = F, legend = TRUE, 
         clustering_distance_rows = "euclidean", border_color = FALSE)
 

введите описание изображения здесь

Ответ №1:

Это похоже на ОГРОМНЫЙ взлом, и, возможно, есть лучший способ сделать это, но, похоже, он не pheatmap поддерживает эту функциональность из коробки. Я смог сгенерировать то, что, по моему мнению, вы хотите, но точные размеры и расположение каждого из слоев будут зависеть от выходного размера графика. В принципе, я нарисовал черный прямоугольник позади графика, нарисовал аннотации букв, которые вы хотите, в нижней части графика, создал тепловую карту без имен столбцов, изменил ее размер и, по сути, добавил слои к графику.

 bg_color <- "black"
bg <- rasterGrob(bg_color,
                 x = 0.5,
                 y = 0.395,
                 width = unit(0.5, "npc"),
                 height = unit(0.82, "npc"),
                 interpolate = TRUE,
                 vjust = 0.4)

text_p <- richtext_grob("P",
                 x = 0.15,
                 y = 0.025)

text_q <- richtext_grob("Q",
                        x = 0.44,
                        y = 0.025)

text_t <- richtext_grob("T",
                        x = 0.73,
                        y = 0.025)

hm <- pheatmap(t(scale(df)),
         annotation_col = aka2, 
         annotation_colors = aka3[1],
         annotation_legend = FALSE,
         gaps_col =  c(2,4),
         show_colnames = F, show_rownames = T, cluster_rows = F, 
         cluster_cols = F, legend = TRUE, 
         clustering_distance_rows = "euclidean", border_color = FALSE)

hm$gtable$vp$height <- unit(0.9, "npc")

grid.newpage()
grid.draw(bg)
grid.draw(text_p)
grid.draw(text_q)
grid.draw(text_t)
print(hm, newpage = FALSE)
 

В результате получается:

введите описание изображения здесь