求助:基于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
相关产品推荐
相关产品推荐

