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

R语言circlize包chordDiagram绘制circos图时添加外侧额外轨道

弦图添加外层分组实现方案

核心逻辑:不需要传入特殊格式的链接类数据,通过circlize包原生的group分组参数+自定义外层轨道,即可实现内层基因、外层受体类别的两层结构。

实现步骤

  • 整理节点-分组映射:把弦图所有节点(from侧的起始基因、to侧的靶基因)和对应的外层分组做一一映射,from侧的基因可以统一归为配体类大组,to侧的靶基因按对应受体类别分组。
  • 绘制基础弦图:调用chordDiagram时传入分组映射参数,让同大组的内层扇区自动聚集,同时预留给外层轨道的绘图空间,调大组间间距方便区分不同大组。
  • 自定义外层轨道:按大组汇总每个分组覆盖的角度范围,在外层绘制分组色块、添加分组标签。
  • 补充内层标签:在内层扇区轨道添加对应的基因名标签,调整文字朝向避免阅读困难。

可运行示例代码

library(circlize)

# 原始弦图链接数据
links <- data.frame(from = c("A", "B", "C", "B", "C"),
                     to = c("D", "E", "F", "D", "E"),
                    value = c(1, 1, 1, 1, 1))

# 构建节点到外层大组的映射,如果你已有categories映射表,可直接用setNames转换为命名向量
# 例:target_group <- setNames(categories$to, categories$from),再补充from侧节点的分组即可
group_mapping <- c(
  "A" = "配体组", "B" = "配体组", "C" = "配体组",
  "D" = "X受体", "E" = "X受体", "F" = "Y受体"
)

# 初始化绘图参数,避免之前的绘图残留
circos.clear()
# 绘制基础弦图
chordDiagram(links, 
             group = group_mapping,
             gap.degree = c("group" = 5, "inside" = 1), # 组间留5度空隙,组内节点间留1度空隙
             annotationTrack = "grid", # 仅保留内层扇区网格,预留标签空间
             preAllocateTracks = list(track.height = 0.15) # 预分配外层轨道高度
)

# 绘制外层分组色块与标签
all_sectors <- get.all.sector.index()
base_radius <- get.cell.meta.data("cell.outer.radius", all_sectors[1])
group_col <- c("配体组" = "#336699", "X受体" = "#cc6633", "Y受体" = "#339966")

for (g in unique(group_mapping)) {
  # 提取当前大组包含的所有内层扇区
  sub_sectors <- all_sectors[all_sectors %in% names(group_mapping)[group_mapping == g]]
  # 计算当前大组覆盖的起止角度
  start_a <- min(sapply(sub_sectors, function(s) get.cell.meta.data("cell.start.degree", s)))
  end_a <- max(sapply(sub_sectors, function(s) get.cell.meta.data("cell.end.degree", s)))
  # 绘制外层分组色块
  draw.sector(
    start.degree = start_a, end.degree = end_a,
    rou1 = base_radius + 0.15, rou2 = base_radius + 0.07,
    col = group_col[g], border = NA
  )
  # 添加分组标签
  circos.text(
    x = (start_a + end_a)/2, y = base_radius + 0.2,
    labels = g, facing = "clockwise", niceFacing = TRUE,
    cex = 0.9, font = 2
  )
}

# 添加内层基因标签
circos.track(track.index = 1, panel.fun = function(x, y) {
  circos.text(CELL_META$xcenter, CELL_META$ylim[1], CELL_META$sector.index,
              facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex = 0.8)
}, bg.border = NA)

# 绘图结束后清空参数
circos.clear()

调参提示

  • 如果你的靶基因-受体映射存在多对多关系,直接把映射关系整理成「基因名-对应受体」的两列数据框,用setNames(映射表$受体列, 映射表$基因列)一键生成映射向量即可,不需要调整代码其他部分。
  • 可通过修改track.height、色块半径参数、gap.degree值适配自己的数据量,标签过长时可以适当增大外层轨道预留空间,避免文字重叠。

内容的提问来源于stack exchange,提问作者Gordon Beattie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:48:54