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

求助:基于R语言用Chord Diagram或层次边绑定图可视化复杂数据

用R实现Target-化合物关联的可视化(弦图/层次边绑定图)

数据预处理

首先需要把原始的两列数据转换成Target间的共享化合物计数矩阵,同时计算每个Target的总关联化合物数(用于控制节点大小)。先加载必要的R包:

# 安装依赖包(首次运行需执行)
install.packages(c("circlize", "dplyr", "tidyr", "ggraph", "igraph"))

# 加载包
library(circlize)
library(dplyr)
library(tidyr)
library(ggraph)
library(igraph)

读取并处理数据(替换成你的本地文件路径):

# 读取分号分隔的数据集
df <- read.delim("your_dataset.csv", sep = ";", stringsAsFactors = FALSE)

# 1. 筛选关联多个Target的化合物,生成Target两两组合的共享计数
compound_targets <- df %>%
  group_by(Compound) %>%
  summarise(targets = list(unique(Target))) %>%
  filter(lengths(targets) >= 2)

target_pairs <- compound_targets %>%
  mutate(pairs = lapply(targets, function(x) expand.grid(from = x, to = x, stringsAsFactors = FALSE))) %>%
  unnest(pairs) %>%
  filter(from != to) %>%
  group_by(from, to) %>%
  summarise(weight = n(), .groups = "drop")

# 2. 计算每个Target的总关联化合物数(去重统计)
target_sizes <- df %>%
  group_by(Target) %>%
  summarise(size = n_distinct(Compound), .groups = "drop")

方案1:弦图(Chord Diagram)

完全匹配你要求的节点大小、连接粗细、专属颜色需求:

# 转换为矩阵格式
pair_matrix <- target_pairs %>%
  pivot_wider(names_from = to, values_from = weight, values_fill = 0) %>%
  column_to_rownames("from") %>%
  as.matrix()

# 为每个Target分配专属颜色
target_colors <- setNames(rainbow(nrow(target_sizes)), target_sizes$Target)

# 计算节点宽度比例(对应化合物数量)
target_proportions <- target_sizes$size / sum(target_sizes$size)
total_degree <- 360 - length(target_sizes$Target)*10  # 预留节点间隙
sector.degree <- target_proportions * total_degree

# 绘制弦图
circos.clear()
circos.par(gap.degree = 10, track.height = 0.1)
chordDiagram(
  pair_matrix,
  grid.col = target_colors,          # 节点颜色
  transparency = 0.2,                # 连接透明度
  directional = 1,                   # 单向连接
  direction.type = c("arrows", "diffHeight"),  # 方向标记
  link.arr.type = "big.arrow",       # 箭头样式
  link.width = rowSums(pair_matrix), # 连接粗细对应共享化合物数
  sector.degree = sector.degree,     # 节点宽度对应化合物数量
  annotationTrack = "grid",
  annotationTrackHeight = c(0.03, 0.1),
  preAllocateTracks = list(
    list(track.height = 0.1, track.margin = c(0.02, 0))
  )
)

# 添加Target标签
circos.trackPlotRegion(track.index = 2, panel.fun = function(x, y) {
  xlim = get.cell.meta.data("xlim")
  ylim = get.cell.meta.data("ylim")
  sector.name = get.cell.meta.data("sector.index")
  circos.text(mean(xlim), ylim[1] + 0.1, sector.name, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5))
}, bg.border = NA)

方案2:层次边绑定图(Hierarchical Edge Bundling)

如果偏好更简洁的径向布局,可使用此方案:

# 构建igraph对象
nodes <- target_sizes %>% mutate(id = Target)
edges <- target_pairs %>% rename(from = from, to = to, weight = weight)
g <- graph_from_data_frame(edges, vertices = nodes, directed = TRUE)

# 绘制层次边绑定图
ggraph(g, layout = "circle") +
  geom_edge_bundle(aes(width = weight, color = from), alpha = 0.6) +
  geom_node_point(aes(size = size, fill = id), shape = 21, color = "black") +
  geom_node_text(aes(label = id), repel = TRUE) +
  scale_size_continuous(range = c(5, 15)) +
  scale_edge_width_continuous(range = c(0.5, 3)) +
  scale_fill_manual(values = target_colors) +
  scale_edge_color_manual(values = target_colors) +
  theme_void() +
  theme(legend.position = "none")

关键参数说明

  • 节点大小:弦图通过sector.degree控制节点宽度,层次边图通过size映射节点点的大小,均关联Target的化合物数量。
  • 连接粗细:弦图用link.width,层次边图用edge.width,均映射两Target共享的化合物数量。
  • 专属颜色:通过target_colors为每个Target分配唯一颜色,节点和对应连接使用同一颜色,便于关联识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:42:49