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

2hh7jdfx  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(188)

我有一个由不同学科的一些学生的学校成绩制作的数据框。学生也以他们的性别(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等)。我需要将整个名字向量与相应的性别向量相关联(然后在热图上注解它们),因为它们的数量将在未来增加。
预先感谢你的帮助。

sauutmhj

sauutmhj1#

您需要在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
)

n6lpvg4x

n6lpvg4x2#

有了给定的数据,你可以像这样实现你想要的输出:

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"))
  )

相关问题