在 R 中使用 pheatmap 自动分类和添加注释

Automatically categorize and add annotations using pheatmap in R

我有一个数据框,由一些学生在不同学科的学校成绩制成。学生的特征还包括他们的性别(F 或 M),性别作为后缀包含在他们的名字中(例如 Anne_F、Albert_M 等...) 使用这些数据,我用 pheatmap() 包创建了一个热图,方法如下:

library(pheatmap)

  Anne_F <- c(9,7,6,10,6)
  Carl_M <- c(6,7,9,5,7)
  Albert_M <- c(8,8,8,7,9)
  Kate_F <- c(10,5,10,9,5)
  Emma_F <- c(6,8,10,8,7)
  
  matrix <- cbind(Anne_F, Carl_M, Albert_M, Kate_F, Emma_F)
  rownames(matrix) <- c("Math", "Literature", "Arts", "Science", "Music")
  
  print(matrix)
  
  heatmap <- pheatmap(
     mat = matrix,
     cluster_rows = F,
     cluster_cols = F,  
     cellwidth = 30,
     cellheight = 30,
  )
  
heatmap

给出这个矩阵

及相关剧情:

现在我想自动识别学生是男性还是女性,并将其添加为热图中的列注释,以便得到这样的图表:

我想创建两个向量,一个是学生的名字: name <- c("Anne", "Carl", "Albert", "Kate", "Emma") 和一个具有各自性别的人:gender <- c("F", "M", "M", "F", "F") ,但我不知道如何将名字与性别相关联,并在热图上显示它们。

我并不是要手动将一个名字与一个性别相关联(如 Anne 与 F、Albert 与 M 等)。我需要将整个姓名向量与相应的性别向量相关联(然后在热图上对其进行注释),因为他们的数量在未来会增加。

非常感谢您的帮助。

使用给定的数据,您可以像这样获得所需的输出:

  Gender <- sapply(colnames(matrix), function(x) strsplit(x, "_")[[1]][2])
  df     <- as.data.frame(Gender)
  
  pheatmap(
     mat = matrix,
     cluster_rows = F,
     cluster_cols = F,  
     cellwidth = 30,
     cellheight = 30,
     annotation_col = df,
     annotation_colors = list(Gender = c(M = "#6ef88a", F = "#d357fe"))
  )

您需要在 pheatmap 中使用 annotation_col 选项。

library(pheatmap)

# split matrix into "Name" and "Gender"
name_gender_matrix <- str_split_fixed(colnames(matrix), "_", 2)

# Data that maps to the heatmap should be set at the rownames
annot_col <- data.frame(row.names = name_gender_matrix[, 1], Gender = name_gender_matrix[, 2])

# Align the column name of your matrix and with the annotation
colnames(matrix) <- rownames(annot_col)

heatmap <- pheatmap(
  mat = matrix,
  cluster_rows = F,
  cluster_cols = F,  
  cellwidth = 30,
  cellheight = 30,
  annotation_col = annot_col
)