做生信中,最常做的一个工作就是富集分析,比方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好像只吸取离散的单一变量,不继承向量。 |