教你在线绘制circos图-简单!

Python019

教你在线绘制circos图-简单!,第1张

相信大家都听说过circos图,但是亲自画过的人可能就很少,这主要因为软件的安装和使用稍微有一点麻烦。其实,circos图也是可以在线绘制的,这样就简单多了!一起来了解一下吧!

在circos官网(http://circos.ca/)的最右方有个“CIRCOS ONLINE”选项,这里可以实现在线绘制部分circos图。

打开后界面如下:

以微生物多样性分析中样品与物种丰度circos图绘制为例,给大家讲解circos图的绘制功能。该图能够很直观的反映各样品中不同物种所占的比例,以及物种在不同分组或者样品中的分布关系。

绘制circos图

1.数据准备

首先我们要做的就是准备画图所用到的数据,所用数据为物种在各样品中的相对丰度,这里只选用丰度大于0.01的物种用于绘图,数据如下(列名A、B、C为样品,行名Acetobacteraceae等是科一水平的物种分类):

OTUABC

Acetobacteraceae0.5063653216696110.5968872412369940.457528142134733

Arcobacteraceae0.0003294904846044670.0179133872520980.000426249200782749

Bacteroidaceae0.01752092807693420.04558718113953470.352221339584988

Dysgonomonadaceae0.001842974249051360.02565003004872960.0330226880824598

Lachnospiraceae0.005691857602178260.01390206286339050.0173870923992018

Lactobacillaceae0.174952205775860.2379461150250890.0588340146862225

Pseudomonadaceae0.00213263621353880.02862956070929480.0127991010016856

Ruminococcaceae0.003124728441908290.005061219761203110.0274388235522058

Sphingomonadaceae0.2578607015612780.007113946230875610.00898610815104722

由于网站要求的数据格式为非负整数,故将所有的数据乘1000(系统会自动截掉小数点后的数据),输入数据则变为:

OTUABC

Acetobacteraceae506.365321669611596.887241236994457.528142134733

Arcobacteraceae0.32949048460446717.9133872520980.426249200782749

Bacteroidaceae17.520928076934245.5871811395347352.221339584988

Dysgonomonadaceae1.8429742490513625.650030048729633.0226880824598

Lachnospiraceae5.6918576021782613.902062863390517.3870923992018

Lactobacillaceae174.95220577586237.94611502508958.8340146862225

Pseudomonadaceae2.132636213538828.629560709294812.7991010016856

Ruminococcaceae3.124728441908295.0612197612031127.4388235522058

Sphingomonadaceae257.8607015612787.113946230875618.98610815104722

2.绘图

数据准备好就可以来绘制circos图了,只需要导入数据就可以。

生成的图片如下:

可以看到,图中的物种和样品完全是按照字母顺序排列的,我们希望物种和样品分别位列两边,这里可以人为的对其指定顺序。方法也很简单,就是在数据的第一行和第一列用数字来指定顺序。如下:

OTUOTU1   2   3

OTUOTUABC

12Acetobacteraceae506.365321669611596.887241236994457.528142134733

10Bacteroidaceae17.520928076934245.5871811395347352.221339584988

8Dysgonomonadaceae1.8429742490513625.650030048729633.0226880824598

6Lachnospiraceae5.6918576021782613.902062863390517.3870923992018

11Lactobacillaceae174.95220577586237.94611502508958.8340146862225

7Pseudomonadaceae2.132636213538828.629560709294812.7991010016856

5Ruminococcaceae3.124728441908295.0612197612031127.4388235522058

9Sphingomonadaceae257.8607015612787.113946230875618.98610815104722

4Arcobacteraceae0.32949048460446717.9133872520980.426249200782749

第一行指定了样品的顺序,而第一列按丰度指定物种的顺序。生成图片时要勾选下图红框中的选项(排序所用),不然会报错哦!

新图如下:

图中由于部分物种丰度较低,导致物种名重叠,解决这个问题可以改变文字的布局。这时就需要进行设置了。

3.图片设置

点击"settings"进入设置界面,会有很多的设置选项,可以对图片进行细调。

这里只需要修改两个地方即可,将下图第一个红框改为“no”,可以调整文字为垂直布局,避免重叠;但是如果物种名太长,又可能会超出图片范围,所以要缩小圆圈的半径,即将第二个红框改为small。

修改并保存设置后,重新生成图片:

好了,今天我就先给大家介绍到这里,希望对您的科研能有所帮助!祝您工作生活顺心快乐!

更多生物信息课程:

1. 文章越来越难发?是你没发现新思路,基因家族分析发2-4分文章简单快速,学习链接: 基因家族分析实操课程 、 基因家族文献思路解读

2. 转录组数据理解不深入?图表看不懂?点击链接学习深入解读数据结果文件,学习链接: 转录组(有参)结果解读 ; 转录组(无参)结果解读

3. 转录组数据深入挖掘技能-WGCNA,提升你的文章档次,学习链接: WGCNA-加权基因共表达网络分析

4. 转录组数据怎么挖掘?学习链接: 转录组标准分析后的数据挖掘 、 转录组文献解读

5.  微生物16S/ITS/18S分析原理及结果解读 、 OTU网络图绘制 、 cytoscape与网络图绘制课程

6. 生物信息入门到精通必修基础课,学习链接: linux系统使用 、 perl入门到精通 、 perl语言高级 、 R语言画图

7. 医学相关数据挖掘课程,不用做实验也能发文章,学习链接: TCGA-差异基因分析 、 GEO芯片数据挖掘 、 GSEA富集分析课程 、 TCGA临床数据生存分析 、 TCGA-转录因子分析 、 TCGA-ceRNA调控网络分析

8.其他课程链接: 二代测序转录组数据自主分析 、 NCBI数据上传 、 二代测序数据解读 。

热图(heatmap)在生信领域基本就是常规操作,基本技能,入门操作。能画热图的工具也有很多,我自己常用的R包是pheatmap。

最近经常看见环状的热图,所以就搜了一下资料学习一下,测试一下。

环状热图我也经常会在论文中看到,用法和热图相同,但更适合于需要展示较多基因(数据)时来使用。

===安装=====

install.packages("circlize")

install.packages("ComplexHeatmap")

library('ComplexHeatmap')

library('circlize')

===测试===

data<-read.table("expression.txt",header=T,row.names=1)

head(data)

//转化为矩阵并对其进行归一化

madt<-as.matrix(data)

madt2<-t(scale(t(madt)))

Heatmap(madt2)     //这就是默认参数,普通的热图

range(madt2)   //查看值的分布

mycol=colorRamp2(c(-1.7, 0.3, 2.3),c("blue", "white", "red")) //定义颜色范围

circos.heatmap(madt2,col=mycol)  //默认参数

注:

circos.clear()  //绘制完成后需要使用此函数完全清除布局

circos.par(gap.after=c(50))    //

调整圆环首尾间的距离,数值越大,距离越宽

circos.heatmap(madt2,col=mycol, dend.side="inside",rownames.side="outside",rownames.col="black",rownames.cex=0.9,rownames.font=1,cluster=TRUE)

注:dend.side:控制行聚类树的方向,inside为显示在圆环内圈,outside为显示在圆环外圈

#rownames.side:控制矩阵行名的方向,与dend.side相同;但注意二者不能在同一侧,必须一内一外

#cluster=TRUE为对行聚类,cluster=FALSE则不显示聚类

下面是换了inside和outside的结果:

===聚类树的调整和美化(需要用到两个别的包)===

install.packages("dendextend")     //改颜色

install.packages("dendsort")          //聚类树回调

library(dendextend)

library(dendsort)

circos.par(gap.after=c(50))

circos.heatmap(madt2,col=mycol,dend.side="inside",rownames.side="outside",track.height=0.38,rownames.col="black",rownames.cex=0.9,rownames.font=1,cluster=TRUE,dend.track.height=0.18,dend.callback=function(dend,m,si){color_branches(dend,k=15,col=1:15)})

注:track.height:轨道的高度,数值越大圆环越粗  dend.track.height:调整行聚类树的高度  dend.callback:用于聚类树的回调,当需要对聚类树进行重新排序,或者添加颜色时使用

包含的三个参数:dend:当前扇区的树状图;m:当前扇区对应的子矩阵;si:当前扇区的名称   color_branches():修改聚类树颜色

circos.clear()

//添加图例标签等

lg=Legend(title="Exp",col_fun=mycol,direction= c("vertical"))

grid.draw(lg)

//添加列名

circos.track(track.index=get.current.track.index(),panel.fun=function(x,y)

{

if(CELL_META$sector.numeric.index==1)

{

cn=colnames(madt2)

n=length(cn)

circos.text(rep(CELL_META$cell.xlim[2],n)+convert_x(0.3,"mm"), //x坐标

4.1+(1:n)*0.7, //y坐标和间距

cn,cex=0.8,adj=c(0,1),facing="inside")

}

},bg.border=NA)

mycol2=colorRamp2(c(-1.7, 0.5, 2.3),c("#57ab81", "white", "#ff9600"))

也可以更改上面的颜色,从而改变热图的配色:

===分组热图绘制========

#circos.heatmap()内只能是一个矩阵,但如果矩阵数据存在分组,可以用split参数来指定分类变量

split = sample(letters[1:2], 40, replace = TRUE)

split = factor(split, levels = letters[1:2])

circos.clear()

circos.par(gap.after=c(22))

circos.heatmap(madt2,col=mycol,split=split,dend.side="inside",rownames.side="outside",track.height = 0.38,

rownames.col="black",rownames.cex=0.9,

rownames.font=1,

cluster=TRUE,

dend.track.height=0.18,

dend.callback=function(dend,m,si) 

{

color_branches(dend,k=15,col=1:15)

}

)

//假设有两个热图的矩阵数据

madt2<-t(scale(t(madt)))

madt3<-t(scale(t(madt)))

split2 = sample(letters[1:2], 40, replace = TRUE)

split2 = factor(split2, levels = letters[1:2])

circos.clear()

circos.par(gap.after=c(8))

circos.heatmap(madt2,col=mycol2,split=split2,dend.side="outside",

cluster=TRUE,

dend.track.height=0.2,

dend.callback=function(dend,m,si) {

color_branches(dend,k=15,col=1:15)

}

)

circos.heatmap(madt3, col = mycol,rownames.side="inside",rownames.cex=0.8)

1. Seurat对象查看当前的Assay

在进行了SCTransform操作后,矩阵默认会变成SCT矩阵,如果不加设置,后续的PCA等操作都是基于SCT矩阵。

修改DefaultAssay:

2. Seurat使用FindVariables找到高变基因后增删高变基因

3. 不同运行步骤中的文件来源和储存位置⚠️

⚠️:PCA的值是可以被覆盖的,使用三步法对矩阵进行标准化后进行PCA后再使用SCT矩阵进行标准化,PCA的矩阵变成了SCT的PCA矩阵,原有的PCA矩阵不会保留。后续的TSNE和UMAP降维图也和三步法不一样。

4. @data标准化矩阵 和 @scale.data 归一化矩阵 的区别

单细胞RNA 测序数据中,文库之间测序覆盖率的系统差异通常是由细胞间的cDNA 捕获或PCR 扩增效率方面的技术差异引起的,这归因于用最少的起始材料难以实现一致的文库制备。标准化旨在消除这些差异(例如长度,GC 含量),以使它们不干扰细胞之间表达谱的比较。这样可以确保在细胞群体中观察到的任何异质性或差异表达都是由生物学而不是技术偏倚引起的(批次矫正仅在批次之间发生,并且必须同时考虑技术偏差和生物学差异,标准化只需考虑技术差异)。

软件Seurat 提供了三种标准化的方法,分别为LogNormalize、CLR、RC,通常情况下我们采用LogNormalize 的方式进行标准化,计算公式为:log1p((Feature counts/total counts) ∗ scale. factor)

归一化的目的则是使特征具有相同的度量尺度

参考: Seurat的normalization和scaling

5. 关于有些细胞属于同一个cluster但是在umap或者tsne图上相聚较远的问题:UMAP和TSNE是各自的算法在PCA降维的基础上再进行非线形降维,在二维图上把其各自算法认为相近的细胞聚在一起。但是FindClusters输入的不是UMAP或TSNE降维的数据,而是FindNeighbors的数据,而FindNeighbors输入的数据是PCA降维数据,是用另外一种算法计算的细胞之间的距离。因此会出现有些细胞被认为是同一个cluster,但是在umap或者tsne图上相聚较远(尤其是一些散在的,脱离主群的细胞)

6. marker基因鉴定,查看marker基因的表达是使用RNA矩阵还是sct矩阵?

这是一个争议性问题,两个都可以,目前建议最好使用RNA矩阵。

sct的到的count并不是真实的基因表达值,而是通过scaledata倒推出来的,它是一个回归,运算之后的残差。

7. 关于FindAllMarks找到的基因

如下图,先看cluster0的Marker基因:cluster0的差异基因是cluster0的细胞和剩下的所有的cluster合在一起的细胞做对比得到的。pct.1是这个基因在cluster0中的表达比例(S100A8在cluster0的细胞中的表达比例是100%),pct.2是这个基因在除了cluster0以外的所有细胞中的表达比例(S100A8在除cluster0以外的细胞中的表达比例是51.2%)。avg_log2FC是表达差异倍数,p_val_adj是校正后的p值。

8. 在提取Marker基因时比较好的办法:因为单细胞矩阵算出来的结果,p_val_adj==0的有很多,所以可以先把p_val_adj==0先提出来。再把p_val_adj<0.01的按差异倍数靠前的20/30/500...(按需要)个基因提出来,然后把两个矩阵合在一起(取交集)用来做细胞鉴定。(结合p值和fc来做筛选效果更好)

⚠️:提取没有核糖体和线粒体的marker基因更好。(这些基因对鉴定没有帮助)

有些基因比如Foxp3,对细胞鉴定很重要,但常常在筛选Marker基因的时候筛选不出来。 非负矩阵分解 可能更好。

参考: 过滤线粒体核糖体基因

9. 提取亚群

⚠️ 新提取的亚群需要重新进行降维聚类 (和大群相比,标记基因发生了变化),并重新寻找marker基因,重新分群,注释。❗️subset提取子集后,不同样本间批次校正的信息也被去除,需要重新进行批次矫正

参考: Seurat取子集时会用到的函数和方法 ⚠️⚠️⚠️

10. 取子集后如何去除空子集(还存在这个level,但里面包含的细胞为0,如何去除) as.factor(as.character())

11. 双细胞的预测和去除如DoubletFinder建议单样本进行,不建议双样本一起预测。除此之外,其他步骤都可以多样本一起做,质控的时候也可以多样本一起做,但是建议每个样本都单独看一看。

12. 单细胞多样本整合:merge();多样本拆分:SplitObject()

13. 在做多组数据整合,每个组又有多个样本的时候,最好把单独的每个样本当成批次,而不是把不同的组当成批次。

14. 多核运算

参考: 单细胞数据分析中future包的使用

15. pbmc3k.final@commands$FindClusters 可以查看FindClusters运行时间和记录。Seurat是记录其分析过程的,也可查看command下其他操作

16. 关于质控标准:同一组织的最好用同样的标准,不同组织的可以不一样。不同组织线粒体含量等可能存在差异。

17. 可视化的方法总结

参考: https://www.jianshu.com/p/0d1e2c7d21a4

18. circos图绘制

19. 单细胞数据思维导图,有利于查看单细胞数据格式。

https://www.jianshu.com/p/7560f4fd0d77

20. 对于旧版本Seurat对象的更新

scRNA <- UpdateSeuratObject(scRNA)

UpdateSeuratObject {SeuratObject} :Update old Seurat object to accommodate new features

21. 对有些操作需要用到python设置的情况

22. 单细胞数据做pooling的好处:可以尽量的降低dropout的问题。(dropout就是矩阵中的zero,这些zero实际上并不是0,而是每个液滴里面起始反应量太低了。而一般的反转录效率只能到30%左右,70%的转录本实际上在反转录那一步是被丢掉的,这是单细胞测序一个比较大的问题)。

但是一旦做了pooling,你必须要证明pooling对结果是没有影响的(下图的右面三个图)。

23. Seurat的VlnPlot中的combine参数,在如下画三个基因的情况下,设置成T就画一张图,设置成False,会将三个基因各画一张图。

24. rev()这一步是将横坐标的基因反过来排序

这两个画出来的图横坐标基因的顺序是相反的(见NicheNet)

25. 堆叠小提琴图的绘制

完成这个需求有以下几种实现方法:

1. Seurat包直接就可以实现(stack = T)

2. 通过Seuart->scanpy来实现,第一张是Seurat包VlnPlot函数画的图,第二张是scanpy中stacked_violin函数画的图,那么现在问题就变成为Seurat对象到scanpy对象的转换

3. 用R原生函数实现StackedVlnPlot的方法

4. 使用基于scanpy包衍生的scanyuan包来说实现

5. 使用R包MySeuratWrappers来实现

最简单的方法1如下:

如果不设置level,会按字母顺序排列,case会自动排在con前面。

使用Seurat的 RenameIdents 函数也可以

x: table

margin: a vector giving the margins to split by. E.g., for a matrix 1 indicates rows, 2 indicates columns, c(1, 2) indicates rows and columns. When x has named dimnames, it can be a character vector selecting dimension names.

得到的HC_1样本的orig.ident默认是样本名中第一个_号的前一部分。所以要保证矩阵的列名是 样本名_细胞barcode 这样的格式。

如果有多个分组,例如两个样本矩阵中细胞分别命名为HC_1_barcode,HC_2_barcode,在直接通过如下方法得到两个Seurat对象,再对其进行merge之后,两个样本会被合并成一个。也就是样本信息只保留了第一个_号之前的HC,没有保留_号之后的1和2。

为了避免这种情况,可以在构建Seurat对象时通过参数进行设置

⚠️PC数的选择:Seurat官网提供的三种方法只能给出PC数的粗略范围,选择不同PC数目,细胞聚类效果差别较大,因此,需要一个更具体的PC数目。作者提出一个确定PC阈值的三个标准:

一般先选默认分辨率(0.8),大概可能会分出十几个群。因为最终都是要注释到每一个barcode,所以首先可以看大类marker的分布(不受分辨率影响),可以根据marker基因的分布来调整分辨率。是否需要精细的分群得看精细的分群对研究有没有决定作用,还有很重要的一点是 看分出的各个cluster在Findallmarkers给出的结果中marker的热图是不是能明显分开 。精细划分的细胞本来就很类似,如果有部分小群的热图明显分不开或者非常类似,就可以考虑把分辨率调小。

这实际上是没有必要的必须保持一致的。下游的都是用pca之后的,pca是为了压缩数据。

umap和tsne是为了可视化(仅仅是可视化),但是FindNeighbor是计算细胞间距离矩阵。找类群数目和可视化可以说没有关系。

map函数:

R语言循环第三境界:purrr包map函数!

浅析R语言中map(映射)与reduce(规约)

参考: monocle2

查看不同细胞群的中位基因也是一样

查看不同样品的中位基因也是一样

或者也可以