如何在Chord Diagram中呈现三类关联并解决标签重叠与节点缺失问题
问题描述
尝试用circlize包创建弦图,展示样本→物种→标签三类关联,但使用40条样本数据时出现两个问题:
- 标签重叠无法识别(20条样本时无此问题)
- 第三类标签
Seafood完全不显示,无法体现所有物种归属于该标签的关联
示例数据:
Sample Species Label L1 Shark Seafood L2 Tuna Seafood L3 Shark Seafood L4 Shrimp Seafood L5 Crab Seafood L6 Tuna Seafood L7 Shrimp Seafood L8 Shark Seafood L9 Shark Seafood L10 Crab Seafood L11 Tuna Seafood L12 Shrimp Seafood L13 Crab Seafood L14 Crab Seafood L15 Shark Seafood L16 Tuna Seafood L17 Tuna Seafood L18 Shark Seafood L19 Shark Seafood L20 Shrimp Seafood L21 Shark Seafood L22 Tuna Seafood L23 Shark Seafood L24 Shrimp Seafood L25 Crab Seafood L26 Tuna Seafood L27 Shrimp Seafood L28 Shark Seafood L29 Shark Seafood L30 Crab Seafood L31 Tuna Seafood L32 Shrimp Seafood L33 Crab Seafood L34 Crab Seafood L35 Shark Seafood L36 Tuna Seafood L37 Tuna Seafood L38 Shark Seafood L39 Shark Seafood L40 Shrimp Seafood
使用代码:
library(circlize) col.pal = c(Sample.= "blue", Species = "red", Label = "green") chordDiagram(Example, grid.col = col.pal)
另尝试用矩阵构建图表时报错:error non-numeric argument to mathematical function,作为新手寻求解决建议。
解决建议
1. 修复Seafood不显示的问题
chordDiagram默认处理两两关联的两列数据,直接传入三列数据时,函数只会识别前两列(样本与物种)的关联,第三列标签被忽略,因此Seafood节点不显示。需要先构建完整的两两关联数据:
- 保留样本与物种的关联
- 添加物种与标签的关联(统计每个物种对应
Seafood的频次)
预处理代码:
library(circlize) library(dplyr) # 读取示例数据(若已存入Example可跳过此步) Example <- read.table(text = "Sample Species Label L1 Shark Seafood L2 Tuna Seafood L3 Shark Seafood L4 Shrimp Seafood L5 Crab Seafood L6 Tuna Seafood L7 Shrimp Seafood L8 Shark Seafood L9 Shark Seafood L10 Crab Seafood L11 Tuna Seafood L12 Shrimp Seafood L13 Crab Seafood L14 Crab Seafood L15 Shark Seafood L16 Tuna Seafood L17 Tuna Seafood L18 Shark Seafood L19 Shark Seafood L20 Shrimp Seafood L21 Shark Seafood L22 Tuna Seafood L23 Shark Seafood L24 Shrimp Seafood L25 Crab Seafood L26 Tuna Seafood L27 Shrimp Seafood L28 Shark Seafood L29 Shark Seafood L30 Crab Seafood L31 Tuna Seafood L32 Shrimp Seafood L33 Crab Seafood L34 Crab Seafood L35 Shark Seafood L36 Tuna Seafood L37 Tuna Seafood L38 Shark Seafood L39 Shark Seafood L40 Shrimp Seafood", header = TRUE) # 统计样本-物种的关联频次 sample_species <- Example %>% count(Sample, Species, name = "value") # 统计物种-标签的关联频次 species_label <- Example %>% count(Species, Label, name = "value") # 合并两类关联数据 all_links <- rbind(sample_species, species_label)
2. 解决标签重叠问题
样本数量较多时,可通过调整参数优化标签布局:
annotationTrackHeight:增大标签轨道高度gap.after:增加节点间间隙,避免拥挤text.size:缩小标签字体direction:统一标签排列方向
优化后的弦图代码:
# 定义所有节点的颜色 all_nodes <- unique(c(all_links$Sample, all_links$Species, all_links$Label)) col.pal <- c( rep("blue", length(unique(all_links$Sample))), rep("red", length(unique(all_links$Species))), "green" ) names(col.pal) <- all_nodes # 绘制弦图 chordDiagram( all_links, grid.col = col.pal, annotationTrackHeight = c(0.05, 0.1), # 增大标签轨道高度 gap.after = c(rep(1, length(unique(all_links$Sample))), rep(5, length(unique(all_links$Species))), 10), # 差异化间隙 text.size = 0.8, # 缩小标签字体 direction = "clockwise" # 统一标签顺时针排列 )
3. 矩阵构建报错的解决
报错non-numeric argument to mathematical function通常是因为矩阵非数值型。构建矩阵时需确保行、列为节点名称,值为数值型关联频次:
# 正确构建样本-物种矩阵 sample_species_mat <- table(Example$Sample, Example$Species) sample_species_mat <- as.matrix(sample_species_mat) # 转换为数值矩阵
不过对于三级关联,更推荐用长格式数据框(如前面的all_links)传入chordDiagram,更直观且不易出错。
内容的提问来源于stack exchange,提问作者IzOss
相关产品推荐
相关产品推荐

