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"会自动生成基于扇区宽度的刻度,但无法直接自定义断点。需要关闭自动轴绘制,手动计算每个扇区的总链接数并绘制自定义刻度:
步骤与代码:
- 先计算每个扇区的总链接数:
# 统计每个扇区在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")
- 修改
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
相关产品推荐
相关产品推荐

