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

如何在R的circlize弦图中分组并设置组间大间隙、组内小间隙?

这个问题确实是circlize弦图定制化里的常见需求,尤其是生产环境下需要自动适配动态数据的情况。下面是一套不依赖矩阵行列顺序、能自动处理缺失节点的解决方案:

核心思路

通过命名向量定义间隙值匹配节点,自动筛选有数据交互的有效节点,再针对分组内最后一个节点设置大间隙,从而实现组间大间隙、组内小间隙的效果。

完整代码实现

library(circlize)

# 1. 构建邻接矩阵(替换成你的生产环境数据即可)
mat <- matrix(c(0,0,0,0,0,0,1168,0,
                0,0,2545,278,0,0,0,337,
                0,0,0,817,0,0,0,0,
                0,0,0,0,10,0,0,0,
                0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,
                0,0,561,326,0,0,0,281,
                0,0,46,8,0,0,0,0),
              nrow = 8, byrow = TRUE,
              dimnames = list(c("A","B","C","D","E","F","G","H"),
                              c("A","B","C","D","E","F","G","H")))

# 2. 定义分组(可根据业务需求动态调整)
group_list <- list(
  Group1 = "A",
  Group2 = c("B", "C"),
  Group3 = c("D", "E", "F", "G", "H")
)

# 3. 自动筛选有数据交互的有效节点(过滤无连接的节点,比如E、F)
node_degree <- rowSums(mat) + colSums(mat)
valid_nodes <- names(node_degree)[node_degree > 0]

# 4. 配置间隙参数
small_gap <- 2  # 组内小间隙(单位:角度)
big_gap <- 10   # 组间大间隙(单位:角度)

# 初始化间隙向量:默认都是组内小间隙,用节点名称命名
gap_after <- rep(small_gap, length(valid_nodes))
names(gap_after) <- valid_nodes

# 遍历分组,给每个分组的最后一个有效节点设置大间隙
for(group in group_list) {
  # 保留分组定义的原始顺序,筛选出当前分组的有效节点
  group_valid_nodes <- group[group %in% valid_nodes]
  if(length(group_valid_nodes) > 0) {
    last_node_in_group <- tail(group_valid_nodes, 1)
    gap_after[last_node_in_group] <- big_gap
  }
}

# 5. 绘制弦图
chordDiagram(mat, 
             gap.after = gap_after,
             # 可选:添加分组颜色与标签,增强可读性
             group = unlist(lapply(names(group_list), function(n) rep(n, length(group_list[[n]])))),
             group.col = c(Group1 = "#1f77b4", Group2 = "#ff7f0e", Group3 = "#2ca02c"),
             transparency = 0.3)
circos.clear()

关键细节说明

  1. 命名向量gap.after:
    这种方式完全不依赖矩阵的行列顺序,circlize会自动根据节点名称匹配对应的间隙值,完美适配动态数据的行列变动。

  2. 自动过滤无效节点:
    通过计算节点的总连接数(入度+出度),自动识别出会被chordDiagram保留的节点,避免了硬编码节点列表的问题,即使某些分类无数据交互(如示例中的E、F)也会被自动忽略。

  3. 分组顺序控制:
    代码中group_valid_nodes <- group[group %in% valid_nodes]会保留分组定义的原始顺序,确保组内节点排列符合你的业务逻辑,而非默认的字母顺序。

内容的提问来源于stack exchange,提问作者Lars Rönnbäck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:17:42