#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)
В результате получается: