做生信中,最常做的一个工作就是富集分析,例如GO/Pathway富集分析等,而GO/Pathway分析富集的结果目前来说常用气泡图来展示,当然也有人用bar图等,但是相对来说个人还是觉得气泡图好看点。今天包括后面几个帖子我们就学习气泡图的画法。
GO/Pathway富集分析我就不多讲了,有很多现场的工具,如果不是模式生物在,自己计算个超几何分布也能方便的算出富集的结果。一般富集完,我们会得到富集的GO/Pathway,以及相应的pvalue,GO/Pathway上的基因数目以及和自己输入基因overlap的基因数目(这个一般就是常见的Richfactor计算方式)。下面是我们这个part用到的测试数据,其实也是我真实数据的一部分。包括的内容比较多有多个时间点的GO富集结果,只不过我放在一个文件中了。
今天我们先测试一个时间点,也就是一个富集结果的画法。一般一个样品的富集结果的话,x轴是RichFactor,Y轴是GO或者pathway,颜色代表pvalue,大小用proteinNumber来展示。
library(ggplot2)
library(ggthemes)
data <- read.table("data.txt",header = T,sep = "\t")
dt1 <- data[data$Time=="0.25h",] //只选了一个时间点,我准备的测试数据是有6个时间点的
还是用最简单的ggplot
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()
coord_flip() //坐标轴翻转 当然x和y的两个量换换也是可以的
这个默认色系不好看,换个色系。
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')
其实ggplot里面的颜色设置,我一直也搞得不是太明白。
可以选择自己的一组颜色并通过函数 scale_*_manual() 将它们分配给分类变量(* 可以是color、colour或fill)。指定颜色的数量必须与类别数量匹配。这个比较适用于一些离散的分组变量。
ColorBrewer 调色板是一种流行的在线工具,用于为地图选择配色方案。不同的颜色组旨在产生具有相似外观的有吸引力的配色方案,范围从三到十二不等。这些调色板可作为 ggplot2 包中的内置函数使用,并且可以通过调用 scale_*_brewer() 来应用。
有许多扩展包提供额外的调色板。它们的用途因包的设计方式而异。有关 R 中可用调色板的广泛概述,可以使用 paletteer 包,这是 R 中使用一致语法的调色板的集合。
ggsci包提供科学期刊和科幻主题的调色板。scale_color_aaas() scale_color_npg()
但是上面几类都比较适用于离散的分组变量。
在我们的示例中,我们将要着色的变量为pvalue,这是一个连续变量。函数 scale_*gradient() 是一个顺序梯度,而 scale*_gradient2() 是发散的。所以我们可以通过 scale_*_gradient() 为连续变量手动设置逐渐变化的调色板。
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')
所以我们通过这个函数设置了我们的颜色变化区间。
Viridis调色板不仅使您的绘图看起来漂亮且易于感知,而且色盲的人也更容易阅读并且灰度打印效果很好。
p1 <-ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()
p1+ scale_color_viridis_c()
p1+ scale_color_viridis_c(option = "inferno")
p1+ scale_color_viridis_c(option = "plasma")
p1+ scale_color_viridis_c(option = "cividis")
但是好像还是红蓝的是paper中最常用的。
但是目前还是灰色背景,我们再把背景去掉。
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()
我们也可以比较一下常用的外观主题模式:
p1<-ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')
p2 <- p1+theme_gray()
p3 <- p1+theme_bw()
p4 <- p1+theme_classic()
p5 <- p1+theme_light()
p6 <- p1+theme_void()
p7 <- p1+theme_linedraw()
p8 <- p1+theme_minimal()
p9 <- p1+theme_dark()
cowplot::plot_grid(p1,p2,p3,p4,ncol = 2)
可以看出,默认就是gray
cowplot::plot_grid(p5,p6,p7,p8,ncol = 2)
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=Pvalue,size=ProteinNumber))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()+
theme(axis.text=element_text(size = 15,color = "black"))+
theme(axis.title = element_text(size = 20))
像上次一样改变label以及title的字体
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=-log10(Pvalue),size=log(ProteinNumber)))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()+
theme(axis.text=element_text(size = 15,color = "black"))+
theme(axis.title = element_text(size = 20))
调整一下颜色和大小显示的scale。比如用pvalue的-log10,ProteinNumber的log。
从我们的测试数据来看,我们还把我们的GO/Pathway分成了三类,如果我们想在图上分类显示的话,如何实现?
这个效果可以通过facet_grid()或者facet_wrap()来实现。
facet_grid()形成由行和列面化变量定义的面板矩阵。当有两个离散变量,并且这些变量的所有组合存在于数据中时,它是最有用的。如果只有一个具有多个级别的变量,请尝试facet_wrap()。
facet_wrap()将一维面板序列包装成2d。这通常比facet_grid()更好地利用了屏幕空间,而且显示基本上是矩形的。
分面图是根据数据类别按照行或者列,或者矩阵分面的方式将散点图,柱形图等基础图标展示四到五维的数据结构。
它们的用法如下:
facet_grid():
facet_grid(rows = NULL,cols = NULL,scales = "fixed",space = "fixed",shrink = TRUE,labeller = "label_value",as.table = TRUE,switch = NULL,drop = TRUE,margins = FALSE,facets = NULL)
facet_wrap():
facet_wrap(facets,nrow = NULL,ncol = NULL,scales = "fixed",shrink = TRUE,labeller = "label_value",as.table = TRUE,switch = NULL,drop = TRUE,dir = "h",strip.position = "top")
rows:一组变量或表达式,由vars()引用并定义面,比如rows=vars(x)是指将变量x作为维度进行分面,并且可以使用多个分类变量。
cols:表示列维度上的组。可以对变量进行命名(将名称传递给标签器)。比如cols=vars(x)表示将变量x作为维度进行列分面。
scales:表示分面后坐标轴的尺度按照什么规则进行适应。(默认为"fixed"),按行适应(“free_x”)、按照列(“free_y”)适应,或者跨行和列(“free”)。
space:如果“fixed”,默认,所有面板有相同的大小。如果"free_y"它们的高度将与y刻度的长度成比例;如果“free_x”,它们的宽度将与x刻度的长度成比例;或者“free”时,高度和宽度都会发生变化。除非适当的刻度也发生变化,否则此设置没有效果。
Shrink:如果为真,将缩小规模以适应统计输出,而不是原始数据。如果为假,将范围内的原始数据进行统计汇总。
labeler:默认情况下使用label_value()。
as.table:如果为真,则默认情况下,facet的布局类似于在右下方具有最高值的表。如果为假,那么这些面就像一个在右上角有最高值的情节一样被布置。
switch:默认情况下,标签显示在绘图的顶部和右侧。如果“x”,顶部的标签将显示在底部。如果是“y”,则右侧的标签将显示在左侧。也可以设置为“both”。
facets:此参数不建议使用,请使用行rows和cols代替.
dir: 方向:“h”代表默认水平方向,“v”代表默认垂直方向。
strip.position:默认情况下,标签显示在图形的顶部。使用地带。位置通过设置条带,可以将标签放置在四个边的任意一边。position = c("top", "bottom", "left", "right")。
用我们的数据来测试一下效果:
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=-log10(Pvalue),size=log(ProteinNumber)))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()+
theme(axis.text=element_text(size = 14,color = "black"))+
theme(axis.title = element_text(size = 20))+
facet_grid(rows=vars(Class))
可以看出,确实按class分成了三类,并且我们制定的是rows的空间分类的。但是明显都挤在一起了,所以需要调整参数scales和space。
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=-log10(Pvalue),size=log(ProteinNumber)))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()+
theme(axis.text=element_text(size = 14,color = "black"))+
theme(axis.title = element_text(size = 20))+
facet_grid(rows=vars(Class),scales = "free_y")
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=-log10(Pvalue),size=log(ProteinNumber)))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()+
theme(axis.text=element_text(size = 14,color = "black"))+
theme(axis.title = element_text(size = 20))+
facet_grid(rows=vars(Class),scales = "free_y",space = "free_y")
调整完scale和space之后,就明显顺眼多了。但是我可能还想要每个类别的背景色。
ggplot(dt1)+geom_point(aes(x=GO,y=RichFactor,colour=-log10(Pvalue),size=log(ProteinNumber)))+
coord_flip()+
scale_colour_gradient(low = 'blue', high = 'red')+
theme_light()+
theme(axis.text=element_text(size = 14,color = "black"))+
theme(axis.title = element_text(size = 20))+
facet_grid(rows=vars(Class),scales = "free_y",space = "free_y")+
theme(strip.background = element_rect(fill=c("blue")),strip.text = element_text(size = 10))
通过theme()元素strip.background和strip.text一次更改所有刻面标签颜色(以及刻面标签文本)。
但是,我可能还需要调整面板根据class为不同的颜色。但是,我还不太知道如何处理。因为strip.background好像只接收离散的单一变量,不接受向量。