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

如何用R circlize包绘制扇区长度匹配总频率的Circos弦图

使用circlize包绘制符合要求的Circos弦图

要实现你需要的两个要求(展示所有组合连线、扇区长度匹配类别总频率),可以通过手动指定扇区宽度并保留所有组合数据来解决,具体步骤如下:

1. 准备数据与加载包

首先加载circlize包,然后导入你的示例数据集:

library(circlize)

circos_df <- data.frame(
     from = c("C", "D", "D", "D", "A", "A", "A", "A", 
              "A", "F", "F", "B", "B", "B", "B"),
     to = c("E", "F", "C", "E", "B", "D", "F", "C", 
            "E", "C", "E", "D", "F", "C", "E"),
     value = c(1, 0, 0, 0, 1, 0, 1, 2, 2, 1, 4, 1, 2, 0, 1),
     total_freq = c(4, 6, 6, 6, 12, 12, 12, 12, 12, 26, 26, 4, 4, 4, 4),
     normalized_freq = c(0.1538462, 0.2307692, 0.2307692, 0.2307692, 
                         0.4615385, 0.4615385, 0.4615385, 0.4615385,
                         0.4615385,1.0000000, 1.0000000, 0.1538462,
                         0.1538462, 0.1538462, 0.1538462 ))

2. 构建扇区宽度映射

提取所有类别(包括仅出现在to列的E)的总频率,创建扇区宽度的命名向量,用于控制扇区长度:

# 获取所有唯一类别
all_categories <- unique(c(circos_df$from, circos_df$to))

# 提取from类别的总频率(每个from类别对应的total_freq是唯一值)
sector_freq <- aggregate(total_freq ~ from, data = circos_df, FUN = function(x) unique(x))
colnames(sector_freq) <- c("category", "total_freq")

# 补充E的总频率(E仅出现在to列,总频率为所有指向E的value之和)
e_total <- sum(circos_df$value[circos_df$to == "E"])
sector_freq <- rbind(sector_freq, data.frame(category = "E", total_freq = e_total))

# 创建扇区宽度的命名向量(名称为类别,值为对应总频率)
sector_widths <- setNames(sector_freq$total_freq, sector_freq$category)

3. 处理零值组合

chordDiagram默认会忽略value=0的连线,将这些零值替换为极小值,确保所有from-to组合都能显示连线:

circos_df$value[circos_df$value == 0] <- 0.01

4. 绘制弦图

使用chordDiagram时,通过sector.width参数指定扇区宽度,确保扇区长度与类别总频率成正比:

# 初始化circos布局(可选:调整起始角度让图更美观)
circos.par(start.degree = 90)

chordDiagram(
  x = circos_df[, c("from", "to", "value")],  # 使用处理后的value列
  sector.width = sector_widths,               # 指定扇区宽度对应总频率
  preAllocateTracks = list(track.height = 0.1),
  annotationTrackHeight = c(0.02, 0.1),
  annotationTrack = c("name", "grid"),
  direction.type = "arrows",
  link.lwd = 0.5,                             # 调整连线宽度避免过粗
  link.col = adjustcolor("black", alpha.f = 0.5)  # 增加透明度方便区分连线
)

# 关闭circos布局
circos.clear()

关键说明

  • 扇区长度控制:通过sector.width手动指定每个类别的总频率,替代了默认的“连线频率总和”计算方式,实现扇区长度与类别总频率成正比。
  • 保留所有组合:将value=0替换为极小值,避免这些组合被过滤,确保所有from-to配对都有连线展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:07:34