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

R语言circlize包:弦图扇区间隙缩小与刻度调整问题

解决方案:circlize弦图的扇区间隙与刻度自定义问题

1. 扇区间隙优化问题的解决

你之前的circos.par(gap.after)设置无效,核心原因有两个:

  • 调用时机错误:circos.par()必须在chordDiagram()之前执行,绘图后设置不会生效;
  • 参数长度不匹配:你用了unique(Div_df$from/to)的长度,但实际扇区是Div_sect集合,两者数量可能不一致。

正确实现方式:

在调用chordDiagram()前,基于实际扇区列表Div_sect设置间隙:

library(circlize)
library(dplyr)

# 全局设置所有扇区间隙为0.3(单位:度)
circos.par(gap.after = rep(0.3, length(Div_sect)))

# 如果需要组间间隙更大、组内更小,可基于分组信息设置:
gap_vals <- ifelse(Div_group == lag(Div_group, default = ""), 0.3, 2) # 组内0.3,组间2度
circos.par(gap.after = gap_vals)

# 之后再调用chordDiagram
chordDiagram(Div2_df %>% select(from, to), 
             order = Div_sect, 
             group = Div_group, 
             grid.col = Div_grid.col, 
             directional = 1, 
             direction.type = c("diffHeight", "arrows"), 
             annotationTrack = c("grid", "axis"), 
             link.arr.col = rep("gray100", nrow(Div2_df)), 
             preAllocateTracks = 1)

2. 自定义刻度为扇区链接计数的解决

默认的annotationTrack="axis"会自动生成基于扇区宽度的刻度,但无法直接自定义断点。需要关闭自动轴绘制,手动计算每个扇区的总链接数并绘制自定义刻度:

步骤与代码:

  1. 先计算每个扇区的总链接数:
# 统计每个扇区在from和to中的总出现次数(即总链接数)
sector_counts <- table(c(Div2_df$from, Div2_df$to))
sector_counts_df <- as.data.frame(sector_counts, stringsAsFactors = FALSE)
colnames(sector_counts_df) <- c("sector", "count")
  1. 修改chordDiagram参数,关闭自动轴绘制,手动绘制刻度:
circos.par(gap.after = rep(0.3, length(Div_sect))) # 先设置间隙

chordDiagram(Div2_df %>% select(from, to), 
             order = Div_sect, 
             group = Div_group, 
             grid.col = Div_grid.col, 
             directional = 1, 
             direction.type = c("diffHeight", "arrows"), 
             annotationTrack = "grid", # 仅绘制网格,不自动生成轴
             link.arr.col = rep("gray100", nrow(Div2_df)), 
             preAllocateTracks = 2) # 预分配2个轨道:1个放刻度,1个放标签

# 循环绘制自定义刻度和扇区标签
for(si in get.all.sector.index()) {
  # 获取当前扇区的总链接数
  total_count <- sector_counts_df$count[sector_counts_df$sector == si]
  # 自定义刻度断点:从0到总计数,自动调整间隔(避免刻度过密)
  breaks <- seq(0, total_count, by = max(1, floor(total_count/5)))
  
  # 绘制自定义轴
  circos.axis(sector.index = si, track.index = 1, 
              breaks = breaks, 
              labels = breaks,
              major.at = breaks,
              direction = "outside")
  
  # 绘制扇区名称(保留原有逻辑)
  xlim = get.cell.meta.data("xlim", sector.index = si, track.index = 2)
  ylim = get.cell.meta.data("ylim", sector.index = si, track.index = 2)
  circos.text(mean(xlim), mean(ylim), 
              labels = gsub("\\..*","", si), 
              sector.index = si, track.index = 2,
              col = "black", cex = 1.2, facing = "clockwise", 
              adj = c(-0.5, 0), niceFacing = TRUE)
}

# 结束绘图,重置circos参数
circos.clear()

说明:

  • preAllocateTracks=2用于分别存放刻度和标签,避免重叠;
  • breaks的计算逻辑会根据总链接数自动调整间隔,确保刻度清晰;
  • 最后调用circos.clear()重置绘图环境,避免影响后续绘图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:34:58