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

如何制作分组堆叠Circos图?基于R的circlize包实现定制绘图

基于circlize包绘制分组Circos比例图

以下是使用circlize包实现需求的完整代码,可生成符合要求的分组Circos比例图:

# 加载所需包
library(circlize)
library(tidyverse)

# 生成示例数据(固定随机种子保证结果可复现)
set.seed(123)
group <- c(rep("G1",3), rep("G2",3))
gene <- rep(letters[1:3], 2)
enst1 <- runif(6, min = 0, max = 1)
enst2 <- runif(6, min = 0, max = 1)
enst3 <- runif(6, min = 0, max = 1)
enst4 <- runif(6, min = 0, max = 1)
enst5 <- runif(6, min = 0, max = 1)
mtx <- cbind.data.frame(enst1, enst2, enst3, enst4, enst5)*1/rowSums(cbind.data.frame(enst1, enst2, enst3, enst4, enst5))
div <- round(runif(6, min = 1, max = 3), 2)
data <- cbind.data.frame(group, gene, mtx, div)

# 转换为长格式数据,适配circlize绘图逻辑
data_long <- data %>%
  pivot_longer(cols = starts_with("enst"), names_to = "transcript", values_to = "proportion")

# 定义扇区顺序:G1组3个基因在前,G2组3个在后
sector_order <- paste(data$group, data$gene, sep = "_")

# 初始化circos参数
circos.clear()
circos.par(
  start.degree = 90,          # 从顶部开始绘制
  gap.degree = c(rep(5, 5), 20), # 组间留20度间隙区分两半
  track.height = 0.15,        # 比例轨道的高度
  cell.padding = c(0, 0, 0, 0)
)

# 创建自定义扇区,每个扇区对应一个基因
circos.initialize(sectors = sector_order, xlim = c(0, 1))

# 绘制比例堆叠轨道+div值标注
circos.trackPlotRegion(
  ylim = c(0, 1),
  panel.fun = function(x, y) {
    current_sector <- get.cell.meta.data("sector.index")
    # 获取当前扇区的比例数据
    sector_data <- data_long %>% filter(paste(group, gene, sep="_") == current_sector)
    # 堆叠绘制每个转录本的比例块
    y_pos <- 0
    for(i in 1:nrow(sector_data)){
      prop <- sector_data$proportion[i]
      circos.rect(0, y_pos, 1, y_pos + prop, 
                  col = rainbow(5)[i], border = "white")
      y_pos <- y_pos + prop
    }
    # 在扇区中心添加div值标注
    current_div <- data$div[data$group == str_split(current_sector, "_")[[1]][1] & 
                              data$gene == str_split(current_sector, "_")[[1]][2]]
    circos.text(0.5, 0.5, current_div, cex = 0.8, font = 2)
  }
)

# 添加分组标签
circos.trackPlotRegion(
  track.index = 1,
  bg.border = NA,
  panel.fun = function(x, y) {
    current_sector <- get.cell.meta.data("sector.index")
    group_name <- str_split(current_sector, "_")[[1]][1]
    # 仅在每组第一个基因扇区添加分组标签
    if(str_split(current_sector, "_")[[1]][2] == "a"){
      circos.text(0.5, 1.2, group_name, cex = 1, font = 2)
    }
  }
)

# 添加转录本颜色图例
legend("bottomleft", legend = paste0("enst", 1:5), fill = rainbow(5), bty = "n", cex = 0.8)

关键逻辑说明

  • 分组区分:通过sector_order固定扇区顺序,配合gap.degree在G1和G2组之间设置较大间隙,实现图的两半分区。
  • 比例堆叠:将宽格式数据转为长格式后,循环绘制每个转录本的比例矩形,用彩虹色区分不同enst类型。
  • 标注设置:在每个扇区中心添加对应的div值,同时在轨道上方添加分组标签,提升图的信息可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:54:18