如何用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
相关产品推荐
相关产品推荐

