You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:36:15