Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言学习 - 箱线图(小提琴图、抖动图、区域散点图)

R语言学习 - 箱线图(小提琴图、抖动图、区域散点图)

作者头像
生信宝典
发布于 2018-02-05 03:16:53
发布于 2018-02-05 03:16:53
4.6K00
代码可运行
举报
文章被收录于专栏:生信宝典生信宝典
运行总次数:0
代码可运行

箱线图

箱线图是能同时反映数据统计量和整体分布,又很漂亮的展示图。在2014年的Nature Method上有2篇Correspondence论述了使用箱线图的好处和一个在线绘制箱线图的工具。就这样都可以发两篇Nature method,没天理,但也说明了箱线图的重要意义。

下面这张图展示了Bar plot、Box plot、Volin plot和Bean plot对数据分布的反应。从Bar plot上只能看到数据标准差或标准误不同;Box plot可以看到数据分布的集中性不同;Violin plot和Bean plot展示的是数据真正的分布,尤其是对Biomodal数据的展示。

Boxplot从下到上展示的是最小值,第一四分位数 (箱子的下边线)、中位数 (箱子中间的线)、第三四分位数 (箱子上边线)、最大值,具体解读参见刘永鑫的扩增子图表解读1箱线图:Alpha多样性,老板再也不操心的我文献阅读了

http://www.nature.com/nmeth/journal/v11/n2/full/nmeth.2811.html

一步步解析箱线图绘制

假设有这么一个基因表达矩阵,第一列为基因名字,后面几列为样品名字,想绘制下样品中基因表达的整体分布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
profile="Name;2cell_1;2cell_2;2cell_3;4cell_1;4cell_2;4cell_3;zygote_1;zygote_2;zygote_3
A;4;6;7;3.2;5.2;5.6;2;4;3
B;6;8;9;5.2;7.2;7.6;4;6;5
C;8;10;11;7.2;9.2;9.6;6;8;7
D;10;12;13;9.2;11.2;11.6;8;10;9
E;12;14;15;11.2;13.2;13.6;10;12;11
F;14;16;17;13.2;15.2;15.6;12;14;13
G;15;17;18;14.2;16.2;16.6;13;15;14
H;16;18;19;15.2;17.2;17.6;14;16;15
I;17;19;20;16.2;18.2;18.6;15;17;16
J;18;20;21;17.2;19.2;19.6;16;18;17
L;19;21;22;18.2;20.2;20.6;17;19;18
M;20;22;23;19.2;21.2;21.6;18;20;19
N;21;23;24;20.2;22.2;22.6;19;21;20
O;22;24;25;21.2;23.2;23.6;20;22;21"

读入数据并转换为ggplot2需要的长数据表格式 (经过前面几篇的练习,这应该都很熟了)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
profile_text <- read.table(text=profile, header=T, row.names=1, quote="",sep=";", check.names=F)
# 在melt时保留位置信息
# melt格式是ggplot2画图最喜欢的格式
# 好好体会下这个格式,虽然多占用了不少空间,但是确实很方便

library(ggplot2)
library(reshape2)
data_m <- melt(profile_text)
head(data_m)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  variable value
1  2cell_1     4
2  2cell_1     6
3  2cell_1     8
4  2cell_1    10
5  2cell_1    12
6  2cell_1    14

像往常一样,就可以直接画图了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# variable和value为矩阵melt后的两列的名字,内部变量, variable代表了点线的属性,value代表对应的值。
p <- ggplot(data_m, aes(x=variable, y=value),color=variable) + 
geom_boxplot() + 
theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) +
theme(legend.position="none")
p
# 图会存储在当前目录的Rplots.pdf文件中,如果用Rstudio,可以不运行dev.off()
dev.off()

箱线图出来了,看上去还可以,再加点色彩。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# variable和value为矩阵melt后的两列的名字,内部变量, variable代表了点线的属性,value代表对应的值。
p <- ggplot(data_m, aes(x=variable, y=value),color=variable) + 
geom_boxplot(aes(fill=factor(variable))) + 
theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) +
theme(legend.position="none")
p
# 图会存储在当前目录的Rplots.pdf文件中,如果用Rstudio,可以不运行dev.off()
dev.off()

再看看Violin plot

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# variable和value为矩阵melt后的两列的名字,内部变量, variable代表了点线的属性,value代表对应的值。
p <- ggplot(data_m, aes(x=variable, y=value),color=variable) + 
geom_violin(aes(fill=factor(variable))) + 
theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) +
theme(legend.position="none")
p
# 图会存储在当前目录的Rplots.pdf文件中,如果用Rstudio,可以不运行dev.off()
dev.off()

还有Jitter plot (这里使用的是ggbeeswarm包)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggbeeswarm)
# 为了更好的效果,只保留其中一个样品的数据
# grepl类似于Linux的grep命令,获取特定模式的字符串

data_m2 <- data_m[grepl("_3", data_m$variable),]

# variable和value为矩阵melt后的两列的名字,内部变量, variable代表了点线的属性,value代表对应的值。
p <- ggplot(data_m2, aes(x=variable, y=value),color=variable) + 
geom_quasirandom(aes(colour=factor(variable))) + 
theme_bw() + theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), legend.key=element_blank()) +
theme(legend.position="none")
# 也可以用geom_jitter(aes(colour=factor(variable)))代替geom_quasirandom(aes(colour=factor(variable)))
# 但个人认为geom_quasirandom给出的结果更有特色

ggsave(p, filename="jitterplot.pdf", width=14, height=8, units=c("cm"))

绘制单个基因 (A)的箱线图

为了更好的展示效果,下面的矩阵增加了样品数量和样品的分组信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
profile="Name;2cell_1;2cell_2;2cell_3;2cell_4;2cell_5;2cell_6;4cell_1;4cell_2;4cell_3;4cell_4;4cell_5;4cell_6;zygote_1;zygote_2;zygote_3;zygote_4;zygote_5;zygote_6
A;4;6;7;5;8;6;3.2;5.2;5.6;3.6;7.6;4.8;2;4;3;2;4;2.5
B;6;8;9;7;10;8;5.2;7.2;7.6;5.6;9.6;6.8;4;6;5;4;6;4.5"

profile_text <- read.table(text=profile, header=T, row.names=1, quote="",sep=";", check.names=F)

data_m = data.frame(t(profile_text['A',]))
data_m$sample = rownames(data_m)
# 只挑选显示部分
# grepl前面已经讲过用于匹配
data_m[grepl('_[123]', data_m$sample),]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           A   sample
2cell_1  4.0  2cell_1
2cell_2  6.0  2cell_2
2cell_3  7.0  2cell_3
4cell_1  3.2  4cell_1
4cell_2  5.2  4cell_2
4cell_3  5.6  4cell_3
zygote_1 2.0 zygote_1
zygote_2 4.0 zygote_2
zygote_3 3.0 zygote_3

获得样品分组信息 (这个例子比较特殊,样品的分组信息就是样品名字下划线前面的部分)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以利用strsplit分割,取出其前面的字符串
# R中复杂的输出结果多数以列表的形式体现,在之前的矩阵操作教程中
# 提到过用str函数来查看复杂结果的结构,并从中获取信息
group = unlist(lapply(strsplit(data_m$sample,"_"), function(x) x[1]))
data_m$group = group
data_m[grepl('_[123]', data_m$sample),]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           A   sample  group
2cell_1  4.0  2cell_1  2cell
2cell_2  6.0  2cell_2  2cell
2cell_3  7.0  2cell_3  2cell
4cell_1  3.2  4cell_1  4cell
4cell_2  5.2  4cell_2  4cell
4cell_3  5.6  4cell_3  4cell
zygote_1 2.0 zygote_1 zygote
zygote_2 4.0 zygote_2 zygote
zygote_3 3.0 zygote_3 zygote

如果没有这个规律,也可以提到类似于下面的文件,指定样品所属的组的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sampleGroup_text="Sample;Group
zygote_1;zygote
zygote_2;zygote
zygote_3;zygote
zygote_4;zygote
zygote_5;zygote
zygote_6;zygote
2cell_1;2cell
2cell_2;2cell
2cell_3;2cell
2cell_4;2cell
2cell_5;2cell
2cell_6;2cell
4cell_1;4cell
4cell_2;4cell
4cell_3;4cell
4cell_4;4cell
4cell_5;4cell
4cell_6;4cell"

#sampleGroup = read.table(text=sampleGroup_text,sep="\t",header=1,check.names=F,row.names=1)

#data_m <- merge(data_m, sampleGroup, by="row.names")

# 会获得相同的结果,脚本注释掉了以免重复执行引起问题。

矩阵准备好了,开始画图了 (小提琴图做例子,其它类似)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 调整下样品出现的顺序
data_m$group <- factor(data_m$group, levels=c("zygote","2cell","4cell"))
# group和A为矩阵中两列的名字,group代表了值的属性,A代表基因A对应的表达值。
# 注意看修改了的地方
p <- ggplot(data_m, aes(x=group, y=A),color=group) + 
geom_violin(aes(fill=factor(group))) + 
theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) +
theme(legend.position="none")
p
# 图会存储在当前目录的Rplots.pdf文件中,如果用Rstudio,可以不运行dev.off()

长矩阵绘制箱线图

常规矩阵绘制箱线图要求必须是个方正的矩阵输入,而有时想比较的几个组里面检测的值数目不同。比如有三个组,GrpA组检测了6个病人,GrpB组检测了10个病人,GrpC组是12个正常人的检测数据。这时就很难形成一个行位检测值,列为样品的矩阵,长表格模式就适合与这种情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long_table <- "Grp;Value
GrpA;10
GrpA;11
GrpA;12
GrpB;5
GrpB;4
GrpB;3
GrpB;2
GrpC;2
GrpC;3"

long_table <- read.table(text=long_table,sep="\t",header=1,check.names=F)

p <- ggplot(data_m, aes(x=Grp, y=Value),color=Grp) + 
geom_violin(aes(fill=factor(Grp))) + 
theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) +
theme(legend.position="none")
p
dev.off()

长表格形式自身就是常规矩阵melt后的格式,这种用来绘制箱线图就很简单了,就不做解释了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
24种R语言新手入门之小提琴图(三)
柱状图和箱线图的代码能理解了其实发现好多作图都是可以触类旁通的,小提琴图作为科研结果常用展示图也不可或缺,用ggplot或者vioplot。
生信初学者
2023/03/14
2.1K0
24种R语言新手入门之小提琴图(三)
scRNA分析| Seurat堆叠小提琴图不满足? 那就ggplot2 堆叠 各种元素
单细胞常见的可视化方式有DimPlot,FeaturePlot ,DotPlot ,VlnPlot 和 DoHeatmap几种 ,Seurat均可以实现,但文献中的图大多会精美很多。比如
生信补给站
2023/08/25
4.8K0
scRNA分析| Seurat堆叠小提琴图不满足?  那就ggplot2 堆叠 各种元素
跟着Nature microbiology学作图:R语言ggplot2分组箱线图/wilcox秩和检验
https://www.nature.com/articles/s41564-022-01270-1
用户7010445
2023/08/23
6320
跟着Nature microbiology学作图:R语言ggplot2分组箱线图/wilcox秩和检验
R语言学习 - 热图美化
热图美化 上一期的绘图命令中,最后一行的操作抹去了之前设定的横轴标记的旋转,最后出来的图比较难看。 上次我们是这么写的 p <- p + xlab("samples") + theme_bw() + theme(panel.grid.major = element_blank()) + theme(legend.key=element_blank()) 为了使横轴旋转45度,需要把这句话theme(axis.text.x=element_text(angle=45,hjust=1, vjust=1))放在
生信宝典
2018/02/05
2.7K0
R语言学习 - 热图美化
跟着Nature学作图:R语言ggplot2箱线图、小提琴图、抖动散点图
https://github.com/GRONINGEN-MICROBIOME-CENTRE/DMP
用户7010445
2022/05/23
5.9K0
跟着Nature学作图:R语言ggplot2箱线图、小提琴图、抖动散点图
跟着Nature学作图:R语言ggplot2箱线图/堆积柱形图完整示例
https://www.nature.com/articles/s41586-022-04808-9#MOESM8
用户7010445
2023/01/06
2K0
跟着Nature学作图:R语言ggplot2箱线图/堆积柱形图完整示例
R语言ggplot2每周一图活动第五周:箱线图、小提琴图
在之前提到的tidytuesday里没有找到关于箱线图和小提琴图比较好的实例,这周的ggplot2每周一图活动用之前推文中的内容作为实例进行讲解,之前的推文是跟着Nature学作图:R语言ggplot2箱线图、小提琴图、抖动散点图
用户7010445
2022/05/23
7020
R语言ggplot2每周一图活动第五周:箱线图、小提琴图
raincloud云雨图:一图囊括小提琴+箱线图+散点图
图来自文献:《Benzo[a]pyrene stress impacts adaptive strategies and ecological functions of earthworm intestinal viromes》。
生信菜鸟团
2025/03/17
3190
raincloud云雨图:一图囊括小提琴+箱线图+散点图
ggplot2分组条形图饼图箱线图
写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。
生信喵实验柴
2022/10/25
9020
ggplot2分组条形图饼图箱线图
R语言学习 - 线图绘制
线图 线图是反映趋势变化的一种方式,其输入数据一般也是一个矩阵。 单线图 假设有这么一个矩阵,第一列为转录起始位点及其上下游5 kb的区域,第二列为H3K27ac修饰在这些区域的丰度,想绘制一张线图展示。 profile="Pos;H3K27ac -5000;8.7 -4000;8.4 -3000;8.3 -2000;7.2 -1000;3.6 0;3.6 1000;7.1 2000;8.2 3000;8.4 4000;8.5 5000;8.5" 读入数据 (经过前面几篇的联系,这应该都很熟了) profi
生信宝典
2018/02/05
1K0
R语言学习 - 线图绘制
你还缺scRNA-seq的workflow吗?
之前曾老师给我看了一位在pipebio工作的生信工程师Roman Hillje的scRNA-seq的workflow,今天整理一下分享给大家。
生信菜鸟团
2024/07/31
4420
你还缺scRNA-seq的workflow吗?
[NC图表复现] ggplot2绘制分裂小提琴图
R语言数据分析指南
2024/01/17
4090
[NC图表复现] ggplot2绘制分裂小提琴图
ggplot2轻松绘制误差线点图与箱线图
R语言数据分析指南
2023/08/18
5650
ggplot2轻松绘制误差线点图与箱线图
跟着Nature Methods学画图:R语言ggplot2画小提琴图
论文对应的代码是公开的 https://github.com/ajwilk/2020_Wilk_COVID
用户7010445
2021/03/15
4.5K0
24种R语言新手入门之箱线图(二)
箱线图一般用于可视化基因的表达情况,常化用统计学方法计算组间基因的表达差异情况。以下主要是用boxplot和geom_boxplot
生信初学者
2023/03/14
2.2K0
24种R语言新手入门之箱线图(二)
R语言学习 - 热图绘制 (heatmap)
热图绘制 热图是做分析时常用的展示方式,简单、直观、清晰。可以用来显示基因在不同样品中表达的高低、表观修饰水平的高低等。任何一个数值矩阵都可以通过合适的方式用热图展示。 本篇使用R的ggplot2包实现从原始数据读入到热图输出的过程,并在教程结束后提供一份封装好的命令行绘图工具,只需要提供矩阵,即可一键绘图。 上一篇讲述了Rstudio的使用作为R写作和编译环境的入门,后面的命令都可以拷贝到Rstudio中运行,或写成一个R脚本,使用Rscript heatmap.r运行。我们还提供了Bash的封装,在不修
生信宝典
2018/02/05
5.6K0
R语言学习 - 热图绘制 (heatmap)
R语言ggplot2折线图/散点图/作图添加水印
在小红书看到有的人直接截我公众号的图发,所以想看看能不能在图上添加水印,我搜索了一下看有没有现成的R包可以直接做这个事情。找到了一个R包 tracee
用户7010445
2024/04/15
2270
R语言ggplot2折线图/散点图/作图添加水印
全网最全的R语言基础图形合集
直方图是一种对数据分布情况进行可视化的图形,它是二维统计图表,对应两个坐标分别是统计样本以及该样本对应的某个属性如频率等度量。
生信学习者
2024/06/12
1230
全网最全的R语言基础图形合集
科研绘图系列:R语言绘制SCI论文代码合集
The following code can be used to generate figures for the saliva adhesion assay and opsonic phagocytosis assay (OPK)
生信学习者
2025/02/19
1060
科研绘图系列:R语言绘制SCI论文代码合集
文献组图
追风少年i
2025/01/07
1100
文献组图
推荐阅读
相关推荐
24种R语言新手入门之小提琴图(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验