Circos图神器--circlize包

2022-03-29 13:41:40 浏览数 (1)

导语

GUIDE ╲

circlize包是由德国癌症中心的华人博士Zuguang Gu开发,这个R包包含两个文件,一个是介绍绘制简单圈图的方法,另一个专门介绍基因组数据绘制圈图。

背景介绍

circos plot可以展示不同实体之间的相互关系和彼此分享的一些共通之处,因此这种图表非常适合用来比较数据集或不同数据组之间的相似性,节点围绕圆周分布,点与点之间以弧线彼此连接以显示其中的关系,然后再给每个连接分配权重。它的主要特点在于可以帮助我们看出数据之间的关系,适用于比较数据集或不同数据组之间的数值,但也存在不足之处,比如如果需要显示太多连接的时候会显得比较混乱。

在绘制circos plot的时候大家往往会想到进入circos官网寻找相关信息,但是其提供的方法是基于Perl去绘图的,对于不熟悉Perl的小伙伴们非常的不友好,今天小编给大家介绍一个在R语言中绘制circos图的神器--circlize。它的功能可能比官网中提供的方法更加强大且便捷。接下来就让我们一起学习吧!

circlize包安装

首先安装circlize包以及配色R包RColorBrewer

代码语言:javascript复制
install.packages("circlize")
install.packages("RColorBrewer")

circlize的使用

01

简单和弦图的绘制

首先我们一起看一下R包中包含的函数

代码语言:javascript复制
circos.initialize() ##创建Circos图布对象
circos.track()  ##创建track
circos.update() ##单独需要编辑的cell
circos.par() ##设计Circos的布局,Crcos起始位置设定
circos.info() ##Circos构成信息,CELL_META获取对应的Circos值
circos.clear() ##重置图形参数
circos.points() ##添加点
circos.lines() ##添加由点组成的线
circos.rect() ##绘制矩形,cell也是矩形
circos.polygon() ##绘制多边形,或者说是阴影区域
circos.segments() ##绘制两点之间直线
....

定义一个简单的测试数据集,去使用R包绘图

代码语言:javascript复制
data=matrix(sample(18,18),3,6)
rownames(data)=paste0("R",1:3)
colnames(data)=paste0("C",1:6)
df=data.frame(from=rep(rownames(data),times=ncol(data)),
              to=rep(colnames(data),each=nrow(data)),
              value=as.vector(data),
              stringsAsFactors = F)
chordDiagram(df,grid.col = brewer.pal(9,"Set1")[1:9],link.border = "grey")

02

绘制circos plot

使用circlize包中的函数去绘制circos plot,并且插入柱状图、散点图等。

代码语言:javascript复制
set.seed(999)
n <- 1000
##创建一个数据集
a <- data.frame(factors = sample(letters[1:8], n, replace = TRUE), x = rnorm(n), y = runif(n))
par(mar = c(1, 1, 1, 1), lwd = 0.1, cex = 0.6)
par(mar = c(1, 1, 1, 1), lwd = 0.1, cex = 0.6)
circos.par(track.height = 0.1)

circos.initialize(factors = a$factors, x = a$x)
##初始化
circos.trackPlotRegion(factors = a$factors, y = a$y,                  
                       panel.fun = function(x, y) { circos.axis()})
col <- rep(c("#FF0000", "#00FF00"), 4)##自定义颜色
##加入点
circos.trackPoints(a$factors, a$x, a$y, col = col, pch = 16, cex = 0.5)
circos.text(-1, 0.5, "left", sector.index = "a", track.index = 1)
circos.text(1, 0.5, "right", sector.index = "a")
circos.trackPoints(a$factors, a$x, a$y, col = col, pch = 16, cex = 0.5)
circos.text(-1, 0.5, "left", sector.index = "a", track.index = 1)
circos.text(1, 0.5, "right", sector.index = "a")
bg.col <- rep(c("#EFEFEF", "#CCCCCC"), 4)
##插入柱状图
circos.trackHist(a$factors, a$x, bg.col = bg.col, col = NA)
##插入散点图
circos.trackPlotRegion(factors = a$factors, x = a$x, y = a$y,                       
                       panel.fun = function(x, y) {                       
                         grey = c("#FFFFFF", "#CCCCCC", "#999999")                         
                         sector.index = get.cell.meta.data("sector.index")                         
                         xlim = get.cell.meta.data("xlim")                         
                         ylim = get.cell.meta.data("ylim")                         
                         circos.text(mean(xlim), mean(ylim), sector.index)                         
                         circos.points(x[1:10], y[1:10], col = "red", pch = 16, cex = 0.6)                         
                         circos.points(x[11:20], y[11:20], col = "blue", cex = 0.6)})

circos.updatePlotRegion(sector.index = "d", track.index = 2)
circos.points(x = -2:2, y = rep(0, 5))
xlim <- get.cell.meta.data("xlim")
ylim <- get.cell.meta.data("ylim")
circos.text(mean(xlim), mean(ylim), "updated")

circos.trackPlotRegion(factors = a$factors, y = a$y)
##插入links
circos.trackLines(a$factors[1:100], a$x[1:100], a$y[1:100], type = "h")
circos.link("a", 0, "b", 0, h = 0.3) 
circos.link("c", c(-0.5, 0.5), "d", c(-0.5, 0.5), col = "red", border = NA, h = 0.2) 
circos.link("e", 0, "g", c(-1, 1), col = "green", border = "black", lwd = 2, lty = 2) 
circos.clear()

圆形热图的复杂示例

在本部分演示如何制作复杂的圆形热图。正常布局的热图如下图所示,现在将使用圆形布局进行更改(对DNA甲基化,基因表达与其他基因组水平信息之间的相关性可视化)。

代码语言:javascript复制
library(circlize)
source("https://gist.githubusercontent.com/jokergoo/0ea5639ee25a7edae3871ed8252924a1/raw/57ca9426c2ed0cebcffd79db27a024033e5b8d52/random_matrices.R")
set.seed(123)
km = kmeans(mat_meth, centers = 5)$cluster
###甲基化水平
col_meth = colorRamp2(c(0, 0.5, 1), c("blue", "white", "red"))
circos.heatmap(mat_meth, split = km, col = col_meth, track.height = 0.12)
###甲基化变化的方向(高、低)
col_direction = c("hyper" = "red", "hypo" = "blue")
circos.heatmap(direction, col = col_direction, track.height = 0.01)
###基因表达量
col_expr = colorRamp2(c(-2, 0, 2), c("green", "white", "red"))
circos.heatmap(mat_expr, col = col_expr, track.height = 0.12)
###p-value
col_pvalue = colorRamp2(c(0, 2, 4), c("white", "white", "red"))
circos.heatmap(cor_pvalue, col = col_pvalue, track.height = 0.01)

library(RColorBrewer)
###基因类型(编码基因或lncRNA等)
col_gene_type = structure(brewer.pal(length(unique(gene_type)), "Set3"), names = unique(gene_type))
circos.heatmap(gene_type, col = col_gene_type, track.height = 0.01)
###位点的注释
col_anno_gene = structure(brewer.pal(length(unique(anno_gene)), "Set1"), names = unique(anno_gene))
circos.heatmap(anno_gene, col = col_anno_gene, track.height = 0.01) 
##相关基因从DMR到TSS的距离。
col_dist = colorRamp2(c(0, 10000), c("black", "white"))
circos.heatmap(dist, col = col_dist, track.height = 0.01)
###DMR与增强子重叠的部分。
col_enhancer = colorRamp2(c(0, 1), c("white", "orange"))
circos.heatmap(anno_enhancer, col = col_enhancer, track.height = 0.03)

初始化基因组布局

染色体只是基因组类别的一个特例, circos.genomicInitialize可以使用任何类型的基因组类别来初始化圆形布局。circos.initializeWithIdeogram是由circos.genomicInitialize实现的。circos.genomicInitialize的输入数据至少包含三列的数据。第一列是基因组类别,后两列是每个基因组类别中的位置。

在本示例中,以圆形布局绘制TP53,TP63和TP73的转录本。

代码语言:javascript复制
df = data.frame(
  name  = c("TP53",  "TP63",    "TP73"),
  start = c(7565097, 189349205, 3569084),
  end   = c(7590856, 189615068, 3652765))
circos.genomicInitialize(df)
##首先创建一个识别三个基因的track
tp_family = readRDS(system.file(package = "circlize", "extdata", "tp_family_df.rds"))
head(tp_family)
circos.genomicInitialize(tp_family)
circos.track(ylim = c(0, 1), 
             bg.col = c("#FF000040", "#00FF0040", "#0000FF40"), 
             bg.border = NA, track.height = 0.05)
###依次放置转录本
n = max(tapply(tp_family$transcript, tp_family$gene, function(x) length(unique(x))))
circos.genomicTrack(tp_family, ylim = c(0.5, n   0.5), 
                    panel.fun = function(region, value, ...) {
                      all_tx = unique(value$transcript)
                      for(i in seq_along(all_tx)) {
                        l = value$transcript == all_tx[i]
                        # for each transcript
                        current_tx_start = min(region[l, 1])
                        current_tx_end = max(region[l, 2])
                        circos.lines(c(current_tx_start, current_tx_end), 
                                     c(n - i   1, n - i   1), col = "#CCCCCC")
                        circos.genomicRect(region[l, , drop = FALSE], ytop = n - i   1   0.4, 
                                           ybottom = n - i   1 - 0.4, col = "orange", border = NA)
                      }
                    }, bg.border = NA, track.height = 0.4)
circos.clear()

参考资料:

1、http://circos.ca/

2、http://zuguang.de/circlize_book/book

3、https://blog.csdn.net/kMD8d5R/article/details/79447473

小编总结

R语言中的circlize包提供了chordDiagram()函数可以绘制circos图和和弦图,该函数既可以使用数据框(data.frame)数据,也可以使用矩阵(matrix)数据。大家可以参照circlize官网去学习绘制更复杂circos图的更多内容,祝大家多多掌握函数的细节,自己也能绘制出漂亮的circos plot。

0 人点赞