如何在circlize::chordDiagram中添加轨迹展示多维度数值数据
用circlize实现带基因环形图层的弦图
核心思路
放弃highlight.section,改用circos.track分层绘制自定义环形图层,结合colorRamp2生成渐变配色并添加对应图例。以下是完整可运行的代码示例:
1. 加载依赖包与构造示例数据
library(circlize) library(RColorBrewer) # 弦图连接数据(基因-通路对应关系) chord_data <- data.frame( source = rep(c("GeneA", "GeneB", "GeneC"), each = 2), target = rep(c("Pathway1", "Pathway2"), 3), value = sample(1:10, 6) ) # 基因的数值数据(包含value1/value2/value3,对应log2FC或FDR) gene_values <- data.frame( Gene = c("GeneA", "GeneB", "GeneC"), value1 = rnorm(3, 2, 1), # 示例log2FC数据 value2 = rnorm(3, 0, 1), value3 = rnorm(3, -2, 1) # 示例FDR数据 )
2. 初始化画布与绘制基础弦图
circos.clear() # 设置画布参数:扇区间隙、轨道边距、起始角度 circos.par(gap.degree = 5, track.margin = c(0.02, 0.02), start.degree = 90) # 定义扇区颜色:基因用灰色,通路用区分色 sector_colors <- c(GeneA = "#cccccc", GeneB = "#cccccc", GeneC = "#cccccc", Pathway1 = "#1f78b4", Pathway2 = "#33a02c") # 绘制基础弦图,带箭头方向 chordDiagram(chord_data, grid.col = sector_colors, transparency = 0.3, direction.type = "arrows", link.arr.type = "big.arrow")
3. 创建数值-颜色渐变映射
# 为每个value生成渐变配色,按需调整极值范围 col_value1 <- colorRamp2(c(min(gene_values$value1), 0, max(gene_values$value1)), c("blue", "white", "red")) # log2FC常用蓝红渐变 col_value2 <- colorRamp2(c(min(gene_values$value2), 0, max(gene_values$value2)), c("green", "white", "purple")) col_value3 <- colorRamp2(c(min(gene_values$value3), 0, max(gene_values$value3)), c("yellow", "white", "red")) # FDR常用黄红渐变
4. 添加基因内侧环形图层(value1/value2)
# 在靠近中心的轨道绘制value1和value2的环形 circos.track(ylim = c(0, 1), track.height = 0.1, bg.border = NA, track.index = 2, panel.fun = function(x, y) { sector_name <- get.cell.meta.data("sector.index") # 仅处理基因扇区 if(grepl("Gene", sector_name)) { # 获取当前基因的对应数值 val1 <- gene_values$value1[gene_values$Gene == sector_name] val2 <- gene_values$value2[gene_values$Gene == sector_name] # 归一化数值为环形宽度(按最大绝对值3缩放,可按需调整) width1 <- abs(val1)/3 * 0.4 width2 <- abs(val2)/3 * 0.4 # 绘制value1环形 circos.rect(get.cell.meta.data("xlim")[1], 0.1, get.cell.meta.data("xlim")[2], 0.1 + width1, col = col_value1(val1), border = NA) # 绘制value2环形(与value1留间隙) circos.rect(get.cell.meta.data("xlim")[1], 0.1 + width1 + 0.02, get.cell.meta.data("xlim")[2], 0.1 + width1 + 0.02 + width2, col = col_value2(val2), border = NA) } })
5. 添加基因外侧环形图层(value3)
# 在最外层轨道绘制value3的环形 circos.track(ylim = c(0, 1), track.height = 0.1, bg.border = NA, track.index = 1, panel.fun = function(x, y) { sector_name <- get.cell.meta.data("sector.index") if(grepl("Gene", sector_name)) { val3 <- gene_values$value3[gene_values$Gene == sector_name] width3 <- abs(val3)/3 * 0.8 # 绘制在轨道上部(靠近画布边缘) circos.rect(get.cell.meta.data("xlim")[1], 0.9 - width3, get.cell.meta.data("xlim")[2], 0.9, col = col_value3(val3), border = NA) } })
6. 添加渐变图例
par(cex = 0.8) # value1图例(log2FC) colorlegend(col_value1, at = seq(min(gene_values$value1), max(gene_values$value1), length.out = 5), legend_title = "value1 (log2-FC)", x = 0.9, y = 0.9, width = 0.02, height = 0.2) # value2图例 colorlegend(col_value2, at = seq(min(gene_values$value2), max(gene_values$value2), length.out = 5), legend_title = "value2", x = 0.9, y = 0.6, width = 0.02, height = 0.2) # value3图例(FDR) colorlegend(col_value3, at = seq(min(gene_values$value3), max(gene_values$value3), length.out = 5), legend_title = "value3 (FDR)", x = 0.9, y = 0.3, width = 0.02, height = 0.2)
关键调整点
- 环形位置:通过
track.index控制,数字越小越靠近画布外层,越大越靠近中心 - 环形宽度:修改
abs(val)/3 * 0.4中的系数,可调整环形的相对宽度 - 配色方案:按需替换
colorRamp2中的颜色向量,匹配数据含义 - 图例位置:调整
x和y参数,避免遮挡弦图内容
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

