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

R语言circlize包如何为自定义染色体区块添加指定颜色阴影

R circlize包绘制circos图时如何给染色体自定义区域填充指定颜色阴影

我正在使用R语言circlize包绘制circos图,目标是做出参考论文中图2类似的效果,需要手动指定染色体的部分区域位置,给这些区域填充自定义的不同颜色阴影,目前没找到合适的实现方法。

我已经尝试过的方案存在以下问题:

  • draw.sector使用效果差,该函数需要输入角度参数而非基因组坐标,手动计算角度难度很高
  • circos.initializeWithIdeogram()自带的条带绘制功能仅支持预设物种的标准细胞带格式,无法适配自定义阴影区域的需求,现有公开资料也没有覆盖这个场景

可复现代码

### 加载包
library("tidyverse")
library("circlize")

### 生成模拟数据
# 染色体大小:共5条染色体,长度1-5kb不等
chrom <- c(1,2,3,4,5)
start <- c(0,0,0,0,0)
end <- c(1000,1700,2200,3100,5000)
chr_sizes_df <- data.frame(chrom,start,end)

# 目标阴影区域:需要填充shade_col颜色的染色体区段
chrom_num <- c(1,1,2,2,3,3,3,4,4,5,5,5)
chr <- c("chr1","chr1","chr2","chr2","chr3","chr3","chr3","chr4","chr4","chr5","chr5","chr5")
start <- c(0,900,0,1550,0,800,2000,0,2800,0,3000,4800)
end <- c(150,1000,185,1700,210,1000,2200,300,3100,400,3300,5000)
chr_regions_df <- data.frame(chr,start,end)

# 重组位点:用染色体间连线表示
chr1 <- c(1,2,2,3,3,3,3,4,4,5,5,5,5)
chr1_pos <- c(100,150,170,20,2100,900,950,200,3000,100,3100,3300,4900)
chr2 <- c(1,4,2,1,3,3,5,5,4,3,5,4,2)
chr2_pos <- c(100,3000,170,100,100,900,3200,4800, 3050,10,3100,3300,40)
location <- c("Non coding", "Coding", "Non coding", "Non coding", "Coding", "Coding", "Coding", "Non coding", "Non coding", "Non coding", "Coding", "Coding", "Non coding")
sv_df <- data.frame(chr1,chr1_pos,chr2,chr2_pos,location)

# SNP位点:用点或线表示
chrom <- c(1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5)
pos <- c(350,600,200,650,700,300,1100,1500,2000,400,1500,1800,2000,2700,200,1000,1050,2000,2500,4950)
snp_df <- data.frame(chrom,pos)


### 绘图准备
# 生成配色方案
sv_df$location_col <- ifelse(sv_df$location=="Coding", "#FB8072",
                             ifelse(sv_df$location=="Non coding", "#80B1D3",
                                    "#e9e9e9")
)

# 指定染色体块阴影颜色
shade_col <- "#3F75AB"

# 格式化重排数据
nuc1 <- sv_df %>% select(chr1,chr1_pos) # 起始位点
nuc2 <- sv_df %>% select(chr2,chr2_pos) # 终止位点


### 绘图
## 基础circos图形参数
circos.clear()

circos.par(cell.padding=c(0,0,0,0),
           track.margin=c(0,0.05),
           start.degree = 90,
           gap.degree = 3,
           clock.wise = TRUE)

## 扇区设置
circos.initialize(factors = chr_sizes_df$chrom,
                  xlim = cbind(chr_sizes_df$start, chr_sizes_df$end))

## 绘制染色体基础轮廓
circos.track(ylim=c(0, 1), panel.fun=function(x, y) {
  chr=CELL_META$sector.index
  xlim=CELL_META$xlim
  ylim=CELL_META$ylim
  circos.text(mean(xlim), mean(ylim), chr)
},bg.col="#cde3f9", bg.border=TRUE, track.height=0.1)

## 添加重组连线:按编码/非编码等分类着色
circos.genomicLink(nuc1, nuc2,
                   col=sv_df$location_col,
                   h.ratio=0.6,
                   lwd=3)

运行上述代码生成的示例图:
示例图


解决方案

不需要手动计算角度,也不用依赖预设物种的细胞带注释,直接用circlize自带的基因组区域绘制函数circos.genomicRect()就能实现自定义区域着色,这个函数直接接受基因组坐标输入,不需要做角度转换。

操作注意两点:

  1. 你的chr_regions_df里的染色体名格式是chr1,和初始化时用的数字格式1不匹配,要先把格式统一,把chr_regions_df的chr列去掉前缀chr转成数字,和chr_sizes_df$chrom的格式保持一致,不然会报找不到对应sector的错误。
  2. 在绘制完基础染色体轮廓的track之后、添加连线之前调用矩形绘制函数,矩形的y轴范围直接匹配染色体track的ylim(0到1),就能完全覆盖你要加阴影的染色体区段。

修改后的绘图部分代码如下,直接替换原来的对应部分即可:

## 绘制染色体基础轮廓
circos.track(ylim=c(0, 1), panel.fun=function(x, y) {
  chr=CELL_META$sector.index
  xlim=CELL_META$xlim
  ylim=CELL_META$ylim
  circos.text(mean(xlim), mean(ylim), chr)
},bg.col="#cde3f9", bg.border=TRUE, track.height=0.1)

## 绘制自定义区域阴影
chr_regions_df$chr <- as.numeric(gsub("chr", "", chr_regions_df$chr))
circos.genomicRect(
  region = chr_regions_df,
  ytop = 1, 
  ybottom = 0,
  col = shade_col,
  border = NA
)

## 添加重组连线
circos.genomicLink(nuc1, nuc2,
                   col=sv_df$location_col,
                   h.ratio=0.6,
                   lwd=3)

如果需要给不同区域设置不同颜色,只需要在chr_regions_df里加一列存储对应颜色,然后把col参数映射到这一列就行,不需要额外写循环。如果要加SNP位点,也可以用同样的思路,用circos.genomicPoints()或者circos.genomicRect()(画短竖线)直接传入snp_df的坐标绘制即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:27:31