这里分析小练习来自生信星球(一个很好的生信学习平台),有蛮多值得学习的知识点,一起来学习吧~
- 假设数据:两组实验对象,各三个重复样本。进行转录组分析之类的之后,结果得到10个目标差异基因。
- 目的:用箱线图表达每个基因在两组对象的差异水平。
首先准备假设数据
exp=matrix(rnorm(60),nrow=10)
colnames(exp)=paste0("sample",1:6)
rownames(exp)=paste0("gene",1:10)
#一般分析得到的数据格式:样本为变量/列,基因表达为观测
-
paste0
默认没有分隔符;paste
默认空格为空格符。不过分隔符都可通过seq=""
互相设置。这就是懒的奥义吧,哈哈~
dat=t(exp)
#因为要绘制基因量的箱线图,变量与观测要转置一下
group=rep(c("A","B"),each=3)
#设置分组标签
dat=cbind.data.frame(dat,group)
-
以上就得到了完整的数据表
绘图方法1:patchwork包
p=list()
#list 列表将储存所有的循环绘图,以实现后面的多图组合
library(ggplot2)
for (i in 1:(ncol(dat)-1)){
#之所以减一,是因为最后一列是组类别
p[[i]]=ggplot(data=dat,aes_string(x="group",y=colnames(dat)[i]))+
geom_boxplot(aes(color=group)) +
geom_jitter(aes(color=group))
}
- ggplot()的选项一般为
data
与aes
分别交代数据源以及绘图使用的变量。 - 但是如果需要循环绘图时,将
aes
改成aes_string
,它可以将字符变量映射为ggplot所需的输入参数。
-比如例子中的y=colnames(dat)[i]
分别取gene1、gene2......到gene10。
-还有就是上述是分别做了十张单图,储存在一个列表了,下面将进行拼图组合。
library(patchwork)
# 第一次使用需要安装
wrap_plots(p,nrow=2, guides="collect")
-
guides="collect"
参数 guides应该是绘图示例的意思;"collect"表示所有图共用一组绘图示例(我刚才试了下删除这个参数,果然每个图都配有了相同的绘图示例,就有些多余了。)
绘图方法2:ggplot2法
library(tidyr)
library(dplyr)
library(ggplot2)
- 这次需要加载三个包(前两个包的作者是一个人,厉害),同时还是要第一步准备的数据
dat
dat2 = gather(dat,key = "gene",value = "expression",-group)
- 关于这一步的操作,详见gather()的用法
- 在我理解,就是把所有基因的观测放在一列里(这里就是基因数据都放在单独一列 )
key
交代基因列命名,value
为基因数据命名,以便后面作图。
ggplot(data = dat2)+
geom_boxplot(aes(x = group,y = expression,color = group))+
theme_bw()+
facet_wrap(~gene,nrow = 2)
- 利用
facet_wrap(~gene,nrow = 2)
既交代类分图的依据gene
,也交代了多图排列成两行。有趣的是,排列顺序有问题如下图--
-于是做如下调整,主要是修改gene列的因子
dat2$gene=factor(dat2$gene,ordered = TRUE,levels = paste0("gene",1:10))
ggplot(data = dat2)+
geom_boxplot(aes(x = group,y = expression,color = group))+
theme_bw()+
facet_wrap(~gene,nrow = 2)
-
这样就没问题啦,nice!
简单一次小练习,还是涉及到很多知识点的。加油!