在R中利用circlize绘制圈图

circlize绘制圈图

今天要说的是一个比较常用的图形,也就是圈图。最开始接触圈图是时候我就感觉圈图是极坐标化的条形图,但是在用ggplot绘图时总觉得调整的不太好看,所以就用别人现成的R包绘制就好了。
请添加图片描述

1.绘图前参数设置

rm(list = ls())
options(stringsAsFactors = F)
#install.packages('circlize')
library(circlize)
#清除circos绘图
circos.clear()
#参数
circos.par("track.height"=0.1,gap.degree=3, start.degree =90,
           clock.wise = T,track.margin=c(0,0.02), cell.padding=c(0,0,0,0))


start.degree 绘图起始位置,90表示12点钟
gap.degree track左右间隔大小,gap.after等价
track.margin track上下间隔大小 c(,)
track.height 每个track的默认高度,和track.margin单位一样,都是半径的百分比
cell.padding 看不懂,默认吧 c(,)
clock.wise 排列方式,顺时针 T/F
xaxis.clock.wise x轴,顺时针 T/F

然后介绍以下自带的数据,包括mm10和hg19的

circos.initializeWithIdeogram(species = "mm10", #物种mm10,hg19
                              chromosome.index=c(paste0('chr',1:19),'chrX') 
                              #选择染色体,默认全部,我们只用到1-19和x
                              )

在这里插入图片描述
然后就是绘图所需的数据了,包里有自带的示例数据,可以看到顺序就是chr start end value

bed = generateRandomBed(nr = 200)

在这里插入图片描述
我们在准备数据的时候就按照这个来准备,绘制不同图形用不同数据,比如绘制线图点图有chr start value就好,如果绘制heatmap或者genomicRect这样的范围图则chr start end value都需要。

1.绘图

1.1 function(x,y)类型的绘图

function(x,y)类型的绘图包括折线图,点图等

1.1.1 折线图

方法1:在track中加入circos.lines绘制折线图

#绘图就用circos.track,这个函数表示新建一个层,需要参数染色体,x,y。里边circos.lines用于在层中绘制折线图。
circos.track(factors=bed$chr, x = bed$start, y = bed$value1,track.index=3,
             track.height = 0.05,ylim=c(0,1),
             panel.fun = function(x, y) {

               circos.lines(x, y, col = "red") #默认折线图,x和y来自上边的参数传递
})

在这里插入图片描述

具体track里边的参数如下:
#注意Track的track.height很重要,且每个track的ylim需要设置
factors 染色体列
x 一般start列
y 一般value列,一般只有折线图点图之类的需要xy,其他都是具体区域
#factors,x和y有时候不需要设置,因为有的绘图需要的是region和value的格式
#只需要格式对了就好"chr",“start”,“end”,“value1”
ylim 限制y范围
track.index track索引,定义绘制在哪个track里
track.height 高度,在circos.par可以定义默认的,也可以在track里自定义
track.margin only affect current track
cell.padding only affect current track
bg.col = NA, track的背景色,可以是一个也可以是染色体数目个
bg.border = “black” track的边框,可以是NA
bg.lty = linetype
bg.lwd =linewidth
panel.fun 绘图函数 function(x,y) function(region,value)

circos.track函数相当于进行一个For循环,每次绘制一条染色体,所以在function内部可以用CELL_META s e c t o r . i n d e x 获取每次绘制时当前染色体的 i n d e x ,用 C E L L M E T A sector.index 获取每次绘制时当前染色体的index,用CELL_META sector.index获取每次绘制时当前染色体的index,用CELLMETAylim 获取y的范围,利用用CELL_META$xlim 获取x的范围,利用这一特点我们还可以为折线图绘制阈值线。

th=quantile(bed$value1,0.99)
circos.track(factors=bed$chr, x = bed$start, y = bed$value1,#track.index=3,
             #bg.col=rainbow(19),
             track.height = 0.05,ylim=c(0,1),
             panel.fun = function(x, y) {
               circos.lines(x, y, col = "red") #默认折线图
               circos.segments(x0=CELL_META$xlim[1],x1=CELL_META$xlim[2], #添加segment
                               y0=th,y1=th,col = 'black')
})
})

添加阈值线如下,我这个没有定义track的index,不小心多运行了一次,如果不定义track的index绘制会依次绘制。
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e0e950286474566a3721ac77e53c8a1.png

方法2:
先绘制一个空的track,再用circos.trackLines绘制折线图

circos.track(ylim=c(0,1),track.height = 0.05)
circos.trackLines(factors =bed$chr,x=bed$start,y=bed$value1,col='red')

按照上面的函数多绘制几个track,每个用不同颜色的线表示,大概结果就如下图所示
在这里插入图片描述

1.1.2 点图
circos.track(factors=bed$chr, x = bed$start, y = bed$value1,#track.index=3,
              #bg.col=rainbow(19),
              track.height = 0.05,ylim=c(0,1),
              panel.fun = function(x, y) {
                  circos.points(x, y, col = "red",cex =0.5) 
                  circos.segments(x0=CELL_META$xlim[1],x1=CELL_META$xlim[2],
                                 y0=th,y1=th,col = 'black')
             })

自行调整点的大小
在这里插入图片描述

1.2 function(region,value)类型的绘图

这种绘图需要的数据是chr start end value,是定义某个范围内的数值大小
1.circos.genomicRect

circos.genomicTrack(bed,ylim=c(0,1), #bed是数据名,不用设置chr,x,y了
                    panel.fun = function(region, value, ...) { #resion就是 chr start end value就是value,排列顺序对了就ok
                      circos.genomicRect(region, value, ytop= 0.95, ybottom = 0.05, 
                                         #ytop.column 使用第几列value,或者自定义ytop
                                         col = 'transparent',border='#2686e3',lwd=0.4)
                      #circos.lines(CELL_META$cell.xlim, c(0, 0), lty = 2, col = "#00000040")
                    }, stack = F,track.height = 0.05)

在这里插入图片描述
2.circos.genomicHeatmap
绘制某一区域的热图

col_fun = colorRamp2(c(0,1), c("green", "red"))
chr=c(paste0('chr',1:19),'chrX')
col=rainbow(20)
circos.genomicHeatmap(bed1, col = col_fun, side = "inside", 
                      border = "white",
                      connection_height = mm_h(2),heatmap_height = 0.05,
                      line_col = col[match(bed1$chr,chr)]) #不同染色体用不同颜色绘制

在这里插入图片描述
用到的数据bed1也是多个value数据
在这里插入图片描述

1.3 其他类型的绘图

1.直方图
大概的意思就是看一下你的数据分布情况

bgcol <- rep(c("#fb8072", "#80b1d3"), 10)
circos.trackHist(bed$chr,bed$start, bin.size = 1e7, 
                 bg.col = bgcol, col = NA,track.height = 0.05)

在这里插入图片描述
2.弦图

#直接格式 chr region chr region,h表示弧度
circos.link("chr1", c(5e6,1e7), "chr7", c(2e6,3e7), h = 0.4, col = "blue")
circos.link("chr4", c(5e6,1e7), "chr10", c(2e6,3e7), h = 0.4, col = "red")
circos.link("chr9", c(5e6,1e7), "chr16", c(2e6,3e7), h = 0.4, col = "orange")
circos.link("chr13", c(5e6,1e7), "chr19", c(2e6,3e7), h = 0.4, col = "purple")

在这里插入图片描述
更多绘制函数可以自行在Rstudio中了解

circos.trackxxx #大部分需要新建track,再进行绘图

circos.xxx     #在circos.track()中function(x,y)类型的绘图

circos.genomic #大多为function(region,value)类型的绘图

对了,光介绍的自带数据的染色体,忘记介绍如何自行设置染色体了,等我有时间说一下,很简单。
书接上回,如果要自定义染色体的话那就不要用这个包给的物种染色体。
你需要准备一个文件,包括染色体长度名称和长度两列:
在这里插入图片描述
然后直接定义就好,代码如下

ref<-read.table("Genome_len.txt",header = TRUE) ## 读取染色体长度文件

circos.initialize(factors=ref$Genome,										### 定义染色体
                  xlim=matrix(c(rep(0,19),ref$Length),ncol=2))

这样染色体就定义好了,可以添加了track看一看

circos.track(ylim=c(0,1))

在这里插入图片描述
修饰一下,加上labels和染色体名称

circos.initialize(factors=ref$Genome,										### 定义染色体
                  xlim=matrix(c(rep(0,19),ref$Length),ncol=2))
                  
#设置染色体框
#circos.track每条染色体按顺序轮流function,相当于一个for(chr1:chrn)循环,track.index表示绘图track的索引
circos.track(ylim=c(0,1),panel.fun=function(x,y) {
  Genome=CELL_META$sector.index
  xlim=CELL_META$xlim
  ylim=CELL_META$ylim
  #circos.rect(xlim[1], 0, xlim[2], 1, col = rand_color(19)) #跟bg.col等价
  circos.text(mean(xlim),mean(ylim),Genome,cex=0.5,col=col_text,font = 2,
              facing = "inside", niceFacing = TRUE)
},bg.col= rand_color(20),bg.border=F,track.height=0.06)
#定义好染色体后,在track中用CELL_META$xlim可以调用每条染色体的长度范围
#CELL_META$sector.index 染色体index
#CELL_META$ylim y的范围


brk <- seq(0,200,40)*10^6
#设置x轴axis
#track.index = get.current.track.index() 可以让轴外放
circos.track(track.index = get.current.track.index(), panel.fun = function(x, y) {
  circos.axis(h="top",major.at=brk,labels=round(brk/10^6,1),labels.cex=0.4,
              labels.pos.adjust =0,
              col='#045eaf',labels.col='#045eaf',lwd=0.7,labels.facing="clockwise")
},bg.border=F)

在这里插入图片描述
这样就可以继续进行其他图形的绘制了。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值