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
相关产品推荐
相关产品推荐

