OmicCircos--实现多组学数据的环形可视化!

2022-03-29 13:46:07 浏览数 (1)

导语

GUIDE ╲

OmicCircos 包可以用于生成高质量的circos图,用于可视化组学数据的变化。

背景介绍

今天小编给大家介绍的是一个在R语言中能够方便快捷地绘制高质量circos图的包--OmicCircos,数据可以是来自突变、拷贝数、表达和甲基化分析的基于基因或染色体位置的值。 该软件包能够显示散点图、线条和文本标签的变化。 该基因组特征之间的关系可以以多边形和曲线的形式呈现。

OmicCircos 还能够从多个样本数据中绘制箱线图、直方图和热图。每个轨道都是独立绘制的,这使得用户可以快速轻松地优化轨道。

R包安装

代码语言:javascript复制
BiocManager::install("OmicCircos")
library(OmicCircos)

可视化展示

01

数据准备

输入文件格式

包中使用了四个输入数据文件:segment data, mapping data, link data和link polygon data。

绘制基础圆形需要segment data。其余三个数据集用于绘制额外的轨迹。

##segment data

代码语言:javascript复制
options(stringsAsFactors=FALSE)
library(OmicCircos)
##input hg19 cytogenetic band data
data(UCSC.hg19.chr)
head(UCSC.hg19.chr)

##mapping data

代码语言:javascript复制
options(stringsAsFactors=FALSE)
##TCGA gene expression data
data(TCGA.BC.gene.exp.2k.60)
head(TCGA.BC.gene.exp.2k.60[,c(1:5)])

##link data

代码语言:javascript复制
options(stringsAsFactors=FALSE)
##TCGA fusion gene data
data(TCGA.BC.fus)
head(TCGA.BC.fus[,c(1:6)])

02

基础绘图

输入数据集由 extttsim.circos 函数生成

代码语言:javascript复制
options(stringsAsFactors=FALSE)
library(OmicCircos)
options(stringsAsFactors=FALSE)
set.seed(1234)
#染色体数
seg.num=10
#样本数
ind.num=20
seg.po=c(20:50)
link.num=10#相关对数
link.pg.num=4
##构建数据
sim.out=sim.circos(seg=seg.num,po=seg.po,ind=ind.num,link=link.num,
link.pg=link.pg.num)
##提取构建好的数据
seg.f=sim.out$seg.frame
seg.v=sim.out$seg.mapping
link.v=sim.out$seg.link
link.pg.v=sim.out$seg.link.pg
seg.num=length(unique(seg.f[,1]))

#命名segment(option)
seg.name=paste("chr",1:seg.num,sep="")
db=segAnglePo(seg.f,seg=seg.name)
#设置颜色,设置图形范围
colors=rainbow(seg.num,alpha=0.5)
par(mar=c(2,2,2,2))
plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="",main="")
#绘制外层坐标
circos(R=400,cir=db,type="chr",col=colors,print.chr.lab=TRUE,W=4,scale=TRUE)
##逐层绘制circos
circos(R=360,cir=db,W=40,mapping=seg.v,col.v=3,type="l",B=TRUE,col=colors
[1],lwd=2,scale=TRUE)
circos(R=320,cir=db,W=40,mapping=seg.v,col.v=3,type="ls",B=FALSE,col=colors
[9],lwd=2,scale=TRUE)
circos(R=280,cir=db,W=40,mapping=seg.v,col.v=3,type="lh",B=TRUE,col=colors
[7],lwd=2,scale=TRUE)
circos(R=240,cir=db,W=40,mapping=seg.v,col.v=19,type="ml",B=FALSE,col=colors
,lwd=2,scale=TRUE)
circos(R=200,cir=db,W=40,mapping=seg.v,col.v=19,type="ml2",B=TRUE,col=colors,
lwd=2)
circos(R=160,cir=db,W=40,mapping=seg.v,col.v=19,type="ml3",B=FALSE,cutoff=5,
lwd=2)
circos(R=150,cir=db,W=40,mapping=link.v,type="link",lwd=2,col=colors[c(1,7)])
circos(R=150,cir=db,W=40,mapping=link.pg.v,type="link.pg",lwd=2,col=sample(
colors,link.pg.num))
代码语言:javascript复制
options(stringsAsFactors=FALSE)
library(OmicCircos)
set.seed(1234)
##输入参数
seg.num=10
ind.num=20
seg.po=c(20:50)
link.num=10
link.pg.num=4
##构建数据
sim.out=sim.circos(seg=seg.num,po=seg.po,ind=ind.num,link=link.num,
link.pg=link.pg.num)
seg.f=sim.out$seg.frame
seg.v=sim.out$seg.mapping
link.v=sim.out$seg.link
link.pg.v=sim.out$seg.link.pg
seg.num=length(unique(seg.f[,1]))

#设置segment名字
seg.name=paste("chr",1:seg.num,sep="")
db=segAnglePo(seg.f,seg=seg.name)

colors=rainbow(seg.num,alpha=0.5)
par(mar=c(2,2,2,2))
plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="",main="")
circos(R=400,type="chr",cir=db,col=colors,print.chr.lab=TRUE,W=4,scale=TRUE)
circos(R=360,cir=db,W=40,mapping=seg.v,col.v=8,type="box",B=TRUE,col=colors
[1],lwd=0.1,scale=TRUE)
circos(R=320,cir=db,W=40,mapping=seg.v,col.v=8,type="hist",B=TRUE,col=colors
[3],lwd=0.1,scale=TRUE)
circos(R=280,cir=db,W=40,mapping=seg.v,col.v=8,type="ms",B=TRUE,col=colors
[7],lwd=0.1,scale=TRUE)
circos(R=240,cir=db,W=40,mapping=seg.v,col.v=3,type="h",B=FALSE,col=colors
[2],lwd=0.1)
circos(R=200,cir=db,W=40,mapping=seg.v,col.v=3,type="s",B=TRUE,col=colors,
lwd=0.1)
circos(R=160,cir=db,W=40,mapping=seg.v,col.v=3,type="b",B=FALSE,col=colors,
lwd=0.1)
circos(R=150,cir=db,W=40,mapping=link.v,type="link",lwd=2,col=colors[c(1,7)])
circos(R=150,cir=db,W=40,mapping=link.pg.v,type="link.pg",lwd=2,col=sample(
colors,link.pg.num))

增加标注

代码语言:javascript复制
##输入参数
seg.num=10
ind.num=20
seg.po=c(20:50)
link.num=10
link.pg.num=4
##设置数据
sim.out=sim.circos(seg=seg.num,po=seg.po,ind=ind.num,link=link.num,
link.pg=link.pg.num)

seg.f=sim.out$seg.frame
seg.v=sim.out$seg.mapping
link.v=sim.out$seg.link
link.pg.v=sim.out$seg.link.pg
seg.num=length(unique(seg.f[,1]))

##
seg.name=paste("chr",1:seg.num,sep="")
db=segAnglePo(seg.f,seg=seg.name)
colors=rainbow(seg.num,alpha=0.5)
par(mar=c(2,2,2,2))
plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="",main="")
circos(R=400,type="chr",cir=db,col=colors,print.chr.lab=TRUE,W=4,scale=TRUE)
circos(R=360,cir=db,W=40,mapping=seg.v,col.v=8,type="quant90",B=FALSE,col=
colors,lwd=2,scale=TRUE)
circos(R=320,cir=db,W=40,mapping=seg.v,col.v=3,type="sv",B=TRUE,col=colors
[7],scale=TRUE)
circos(R=280,cir=db,W=40,mapping=seg.v,col.v=3,type="ss",B=FALSE,col=colors
[3],scale=TRUE)
circos(R=240,cir=db,W=40,mapping=seg.v,col.v=8,type="heatmap",lwd=3)
circos(R=200,cir=db,W=40,mapping=seg.v,col.v=3,type="s.sd",B=FALSE,col=colors
[4])
circos(R=160,cir=db,W=40,mapping=seg.v,col.v=3,type="ci95",B=TRUE,col=colors
[4],lwd=2)
circos(R=150,cir=db,W=40,mapping=link.v,type="link",lwd=2,col=colors[c(1,7)])
circos(R=150,cir=db,W=40,mapping=link.pg.v,type="link.pg",lwd=2,col=sample(
colors,link.pg.num))
#添加一些标注(强调) 
the.col1=rainbow(10,alpha=0.5)[3]
highlight=c(160,410,6,2,6,10,the.col1,the.col1)
circos(R=110,cir=db,W=40,mapping=highlight,type="hl",lwd=1)

the.col1=rainbow(10,alpha=0.1)[3]
the.col2=rainbow(10,alpha=0.5)[1]
highlight=c(160,410,3,12,3,20,the.col1,the.col2)
circos(R=110,cir=db,W=40,mapping=highlight,type="hl",lwd=2)

03

label设置

设置外部标签

代码语言:javascript复制
data("TCGA.PAM50genefuhg18")
data("TCGA.BC.fus")
data("TCGA.BC.cnv.2k.60")
data("TCGA.BC.gene.exp.2k.60")
data("TCGA.BC.sample60")
data("TCGA.BCHer2cnvexp")

pvalue=−1*log10(TCGA.BCHer2cnvexp[,5])
pvalue=cbind(TCGA.BCHer2cnvexp[,c(1:3)],pvalue)

Her2.i=which(TCGA.BC.sample60[,2]=="Her2")
Her2.n=TCGA.BC.sample60[Her2.i,1]

Her2.j=which(colnames(TCGA.BC.cnv.2k.60)%in%Her2.n)
cnv=TCGA.BC.cnv.2k.60[,c(1:3,Her2.j)]
cnv.m=cnv[,c(4:ncol(cnv))]
cnv.m[cnv.m>2]=2
cnv.m[cnv.m<−2]=−2
cnv=cbind(cnv[,1:3],cnv.m)

Her2.j=which(colnames(TCGA.BC.gene.exp.2k.60)%in%Her2.n)
gene.exp=TCGA.BC.gene.exp.2k.60[,c(1:3,Her2.j)]
colors=rainbow(10,alpha=0.5)
par(mar=c(2,2,2,2))
plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="")
circos(R=300,type="chr",cir="hg18",print.chr.lab=FALSE,W=4)
circos(R=310,cir="hg18",W=20,mapping=TCGA.PAM50genefuhg18,type="label",6side="out",col=c("black","blue","red"),cex=0.4)
circos(R=250,cir="hg18",W=50,mapping=cnv,col.v=4,type="ml3",B=FALSE,col=
colors[7],cutoff=0,scale=TRUE)
circos(R=200,cir="hg18",W=50,mapping=gene.exp,col.v=4,type="ml3",B=TRUE,col=
colors[3],cutoff=0,scale=TRUE)
circos(R=140,cir="hg18",W=50,mapping=pvalue,col.v=4,type="l",B=FALSE,col=
colors[1],scale=TRUE)
##设置fusion gene colors
cols=rep(colors[7],nrow(TCGA.BC.fus))
col.i=which(TCGA.BC.fus[,1]==TCGA.BC.fus[,4])
cols[col.i]=colors[1]
circos(R=132,cir="hg18",W=50,mapping=TCGA.BC.fus,type="link",col=cols,lwd=2)

设置内部标签

代码语言:javascript复制
par(mar=c(2,2,2,2))
plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="",main="")
circos(R=300,type="chr",cir="hg18",col=TRUE,print.chr.lab=FALSE,W=4)
circos(R=290,cir="hg18",W=20,mapping=TCGA.PAM50genefuhg18,type="label",side="
in",col=c("black","blue"),cex=0.4)
circos(R=310,cir="hg18",W=50,mapping=cnv,col.v=4,type="ml3",B=TRUE,col=colors
[7],cutoff=0,scale=TRUE)

04

结合热图

代码语言:javascript复制
data("TCGA.PAM50genefuhg18")
data("TCGA.BC.fus")
data("TCGA.BC.cnv.2k.60")
data("TCGA.BC.gene.exp.2k.60")
data("TCGA.BC.sample60")

data("TCGA.BCHer2cnvexp")

pvalue=−1✯log10(TCGA.BCHer2cnvexp[,5])
pvalue=cbind(TCGA.BCHer2cnvexp[,c(1:3)],pvalue)

Her2.i=which(TCGA.BC.sample60[,2]=="Her2")
Her2.n=TCGA.BC.sample60[Her2.i,1]
Her2.j=which(colnames(TCGA.BC.cnv.2k.60)%in%Her2.n)
cnv=TCGA.BC.cnv.2k.60[,c(1:3,Her2.j)]
cnv.m=cnv[,c(4:ncol(cnv))]
cnv.m[cnv.m>2]=2
cnv.m[cnv.m<−2]=−2
cnv=cbind(cnv[,1:3],cnv.m)

Her2.j=which(colnames(TCGA.BC.gene.exp.2k.60)%in%Her2.n)
gene.exp=TCGA.BC.gene.exp.2k.60[,c(1:3,Her2.j)]

colors=rainbow(10,alpha=0.5)
par(mar=c(2,2,2,2))
plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="",main="")
circos(R=400,cir="hg18",W=4,type="chr",print.chr.lab=TRUE,scale=TRUE)
circos(R=300,cir="hg18",W=100,mapping=gene.exp,col.v=4,type="heatmap2",7cluster=TRUE,col.bar=TRUE,lwd=0.1,col="blue")
circos(R=220,cir="hg18",W=80,mapping=cnv,col.v=4,type="ml3",B=FALSE,lwd
=1,cutoff=0)
circos(R=140,cir="hg18",W=80,mapping=pvalue,col.v=4,type="l",B=TRUE,
lwd=1,col=colors[1])

cols=rep(colors[7],nrow(TCGA.BC.fus))
col.i=which(TCGA.BC.fus[,1]==TCGA.BC.fus[,4])
cols[col.i]=colors[1]
circos(R=130,cir="hg18",W=10,mapping=TCGA.BC.fus,type="link2",lwd=2,col=cols)

这样我们就实现了circos图与热图的结合,如果希望结合箱线图等类型,也是同样的做法。

小编总结

我们可以看到通过OmicCircos包绘制的基因组circos图是非常高颜值的,可以直接用于论文,有些代码看起来比较长,其实是一层层的绘制circos,了解以后就会非常简单!学会这个工具,多组学数据的环形可视化不成问题!

0 人点赞