【R画图学习3.1】富集气泡图

做生信中,最常做的一个工作就是富集分析,例如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好像只接收离散的单一变量,不接受向量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 0228 1.some refernce materialR CookbookR in Actionggplot2...
    TX_ab85阅读 744评论 0 0
  • 全部流程来自:GEO数据库挖掘—生信技能树B站视频,建议去看原文! 第一步:找到相关的GEO数据集(文献/搜索),...
    slim_zhang阅读 2,221评论 0 7
  • 上篇测试了如何用plot来实现火山图,其实通常还是强大的ggplot包实现更好。 还是用上一篇的测试数据。 lib...
    jjjscuedu阅读 4,597评论 0 6
  • ggplot2图层元素 1. 数据(data):将要可视化的数据 2. 映射(aes):数据中的变量值 一般是X\...
    王尚一阅读 933评论 0 1
  • 作者:严涛浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源 ggplot2学习笔记之图...
    wanghaihua888阅读 2,605评论 0 6