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()就能实现自定义区域着色,这个函数直接接受基因组坐标输入,不需要做角度转换。
操作注意两点:
- 你的
chr_regions_df里的染色体名格式是chr1,和初始化时用的数字格式1不匹配,要先把格式统一,把chr_regions_df的chr列去掉前缀chr转成数字,和chr_sizes_df$chrom的格式保持一致,不然会报找不到对应sector的错误。 - 在绘制完基础染色体轮廓的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
相关产品推荐
相关产品推荐

