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

circlize包弦图绘制报错及布局优化问题求助

解决circlize弦图的布局与参数配置问题

问题描述

使用R语言的circlize包绘制弦图时,配置circos.par()参数出现如下报错:

Error: Since gap.degree parameter has length larger than 1, it should have same length as the number of sectors.

若不配置circos.par(),代码可生成弦图,但存在两个布局问题:

  • 上下半区的扇区间无明显间隙
  • TRAV与TRBV类扇区混合排列,希望将TRAV类置于上方、TRBV类置于下方

错误原因分析

报错的核心原因是circos.par(gap.after)的长度必须与所有扇区的总数完全一致。原代码中仅计算了from和to各自的唯一值数量,未考虑部分元素同时出现在from和to中(如TRAV17、TRBV29-1等),导致gap.after的长度与实际扇区数不匹配,触发报错。

解决方案

以下是修正后的完整代码,同时解决报错和布局问题:

# 加载依赖包
library(circlize)
library(RColorBrewer)

# 原始数据
subset <- structure(list(from = c("TRBV5-6", "TRBV6-1", "TRAV17", "TRBV14", 
"TRBV7-2", "TRBV15", "TRAV38-1", "TRBV29-1", "TRBV6-5", "TRBV6-6", 
"TRBV28", "TRBV7-8", "TRBV20-1", "TRBV7-8", "TRBV29-1", "TRBV29-1", 
"TRBV9"), to = c("TRAV1-1", "TRAV1-2", "TRAV12-2", "TRAV13-1", 
"TRAV14/DV4", "TRAV17", "TRAV20", "TRAV20", "TRAV25", "TRAV27", 
"TRAV3", "TRAV3", "TRAV38-1", "TRAV38-2/DV8", "TRAV5", "TRAV8-2", 
"TRAV8-2"), value = c(56L, 61L, 66L, 48L, 53L, 67L, 61L, 37L, 
86L, 64L, 38L, 144L, 52L, 56L, 31L, 84L, 188L)), class = "data.frame", row.names = c(NA, 
-17L))

# 清理circos环境
circos.clear()

# 1. 自定义扇区顺序:TRAV组在上,TRBV组在下
all_sectors <- unique(c(subset$from, subset$to))
trav_sectors <- sort(grep("TRAV", all_sectors, value = TRUE))
trbv_sectors <- sort(grep("TRBV", all_sectors, value = TRUE))
sector_order <- c(trav_sectors, trbv_sectors)

# 2. 配置颜色(与扇区一一对应)
gridcols <- brewer.pal(12,"Paired")
gridcols <- colorRampPalette(gridcols)(length(sector_order))
names(gridcols) <- sector_order

# 3. 正确设置间隙:长度与扇区数一致
# TRAV扇区间隔1度,组末尾与TRBV组开头留10度间隙;TRBV扇区间隔1度,组末尾留10度间隙
gap_after <- c(rep(1, length(trav_sectors)-1), 10, rep(1, length(trbv_sectors)-1), 10)
circos.par(gap.after = gap_after,
           canvas.xlim = c(-1.5, 1.5),
           canvas.ylim = c(-1.5, 1.5))

# 4. 绘制弦图,指定扇区顺序
chordDiagram(subset, 
             grid.col = gridcols,
             annotationTrack = "grid", 
             preAllocateTracks = 1,
             order = sector_order)

# 5. 添加标签和轴
circos.trackPlotRegion(track.index = 2, panel.fun = function(x, y) {
  xlim = get.cell.meta.data("xlim")
  ylim = get.cell.meta.data("ylim")
  sector.name = get.cell.meta.data("sector.index")
  
  circos.text(mean(xlim), ylim[1] + 2.5, sector.name,
              facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex = 0.6)
  
  circos.axis(h = "top", labels.cex = 0.5, major.tick.length = 0.2, 
              sector.index = sector.name, track.index = 2)
}, bg.border = NA)

# 再次清理环境
circos.clear()

关键修改说明

  • 指定扇区顺序:通过chordDiagram()的order参数,强制TRAV类扇区排列在上方,TRBV类在下方,解决混合排列问题。
  • 匹配间隙长度:计算所有扇区的总数量,确保gap.after的长度与扇区数完全一致,避免参数报错;同时在两组扇区间设置较大间隙,区分上下半区。
  • 颜色对应扇区:给颜色向量命名,确保每个扇区的颜色固定且对应正确。

内容的提问来源于stack exchange,提问作者Zoya Qaiyum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:25:01