如何让ChordDiagram扇区显示模块真实大小而非仅重叠部分?
解决ChordDiagram扇区显示真实模块大小的问题
要让ChordDiagram的扇区反映模块真实大小(而非仅重叠部分),核心是给每个模块补充不重叠部分的数值——通过在邻接矩阵中添加模块的自链接(即模块到自身的数值),让扇区总大小等于「重叠数+不重叠数」。
步骤与代码示例
假设你已有重叠关系矩阵overlap_mat,以及两个数据集各模块的真实大小向量,按以下方式修改代码:
library(circlize) # 示例重叠矩阵:行=数据集1模块,列=数据集2模块 overlap_mat <- matrix(c(10, 5, 3, 8), nrow = 2, ncol = 2, dimnames = list(paste0("D1_", 1:2), paste0("D2_", 1:2))) # 各模块真实大小(替换为你的实际数据) dataset1_real_sizes <- c(20, 16) # D1_1、D1_2的真实大小 dataset2_real_sizes <- c(18, 13) # D2_1、D2_2的真实大小 # 构建包含自链接的完整邻接矩阵 all_sectors <- c(rownames(overlap_mat), colnames(overlap_mat)) full_adj_mat <- matrix(0, nrow = length(all_sectors), ncol = length(all_sectors), dimnames = list(all_sectors, all_sectors)) # 填充重叠关系(原链接部分) full_adj_mat[rownames(overlap_mat), colnames(overlap_mat)] <- overlap_mat # 填充数据集1模块的不重叠部分(自链接) d1_non_overlap <- dataset1_real_sizes - rowSums(overlap_mat) full_adj_mat[rownames(overlap_mat), rownames(overlap_mat)] <- d1_non_overlap # 填充数据集2模块的不重叠部分(自链接) d2_non_overlap <- dataset2_real_sizes - colSums(overlap_mat) full_adj_mat[colnames(overlap_mat), colnames(overlap_mat)] <- d2_non_overlap # 绘制ChordDiagram ChordDiagram(full_adj_mat, grid.col = c(D1_1 = "#E63946", D1_2 = "#457B9D", D2_1 = "#1D3557", D2_2 = "#A8DADC"), annotationTrack = "grid", preAllocateTracks = list(track.height = 0.1)) # 添加扇区标签 circos.track(track.index = 1, panel.fun = function(x, y) { circos.text(CELL_META$xcenter, CELL_META$ylim[1], CELL_META$sector.index, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5)) }, bg.border = NA)
关键逻辑说明
- 自链接补充不重叠部分:每个模块的真实大小 = 与另一数据集的重叠总和 + 自身不重叠部分,将不重叠部分设为模块到自身的链接值,扇区会自动累加该值,最终大小等于真实模块大小。
- 矩阵构建:把两个数据集的模块都纳入邻接矩阵的行和列,既保留原重叠链接,又补充自链接数值。
- 视觉优化:自链接的连线会被扇区自身覆盖,不会干扰重叠关系的展示,仅影响扇区大小。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

