如何制作分组堆叠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
相关产品推荐
相关产品推荐

