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

如何在Chord Diagram中呈现三类关联并解决标签重叠与节点缺失问题

问题描述

尝试用circlize包创建弦图,展示样本→物种→标签三类关联,但使用40条样本数据时出现两个问题:

  1. 标签重叠无法识别(20条样本时无此问题)
  2. 第三类标签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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:05:42