R语言circlize绘制环形热图如何按指定行名设置split分组
问题排查
你当前代码运行结果不符合预期的核心原因有3个:
- 存在全局随机打乱行的操作:
mat1 = mat1[sample(165, 165), ]会完全破坏行顺序和行名的对应关系 - split分组为随机生成:
split = sample(letters[1:5], 165, replace = TRUE)生成的分组和你需要的按行名分界的规则完全无关 - 数据预处理逻辑冗余混乱:定义了mat2、mat3但未正确使用,没有将输入转为纯数值矩阵,容易触发类型报错。
split参数正确赋值逻辑
要实现按指定行名分界分割扇区,遵循以下规则即可:
- split向量长度必须和输入矩阵的行数完全一致,向量的第i个元素对应矩阵第i行所属的分组
- 如果需要控制扇区的排列顺序,必须将split转为因子类型,因子levels的书写顺序就是环形热图从起始角度开始的扇区排布顺序
- 不要提前对整个矩阵做全局排序/打乱,
circos.heatmap()会自动在每个split分组内部完成行聚类,不会跨分组打乱行归属。
修正后的可运行代码
library(circlize) library(ComplexHeatmap) library(dendextend) # 1. 正确预处理输入数据 mat <- read.csv("esters.csv", check.names = FALSE) # 将第一列设为行名 rownames(mat) <- mat[,1] # 仅保留从H6d_T到M10d_P的数值列,移除第一列行名列、第一行非数值表头(可根据你的csv实际结构调整) mat <- mat[-1, -1] # 转为数值矩阵,避免字符类型导致绘图失败 mat <- as.matrix(mat) class(mat) <- "numeric" # 2. 按自定义规则生成split分组 # 提取行名中的ester数字编号 row_id <- as.numeric(gsub("ester", "", rownames(mat))) # 按分界点给每行分配分组标签,可根据你的实际分界需求修改判断条件 split_vec <- rep(NA, nrow(mat)) split_vec[row_id <= 40] <- "group1" # ester1~ester40为第一扇区 split_vec[row_id > 40 & row_id <= 80] <- "group2" # ester41~ester80为第二扇区 split_vec[row_id > 80 & row_id <= 128] <- "group3" # ester81~ester128为第三扇区 split_vec[row_id > 128] <- "group4" # 剩余行为第四扇区 # 转为因子,调整levels顺序即可修改扇区排布顺序 split_factor <- factor(split_vec, levels = c("group1", "group2", "group3", "group4")) # 3. 设置绘图参数 col_fun1 = colorRamp2(c(0, 0.00001, 0.0001, 0.001, 0.01,0.1, 0.4, 0.8), c("#FAFAFA", "#EAF7E7", "#E0F3DC", "#D7F0D1", "#CDEBC6", "#D5E4FD", "#8CACE3", "#5E7192")) circos.par(start.degree = 90, gap.degree = 10) # 4. 绘制环形热图 circos.heatmap(mat, col = col_fun1, split = split_factor, # 传入自定义的因子型分组 dend.track.height = 0.15, dend.side = "inside", rownames.side = "outside", dend.callback = function(dend, m, si) { color_branches(dend, k = 4, col = 1:4) } ) # 绘制图例 lgd = Legend(title = "Relative abundance", col_fun = col_fun1) grid.draw(lgd) # 绘图结束清除circos全局参数 circos.clear()
补充说明
- 如果不需要分组内部的行聚类重排,在
circos.heatmap()中添加参数cluster = FALSE即可,行会完全按照原始矩阵的顺序排列 - 如果需要调整扇区间隔大小,可以修改
circos.par()中的gap.degree参数,给不同扇区设置不同间隔可以传入和分组数量等长的向量给gap.after参数 - 如果需要给扇区添加自定义标签,可以在
circos.heatmap()中设置show.sector.labels = TRUE,或后续通过circos.track()自定义添加扇区注释。
内容的提问来源于stack exchange,提问作者yan wang
相关产品推荐
相关产品推荐

