拿到表达矩阵之后,如何使用ggplot2绘图系统绘制箱线图?
目录
预备知识
绘制箱线图示例
预备知识
1.pivot_longer函数
pivot_longer 是tidyr包中的一个函数,用于将数据框(data frame)从宽格式转换为长格式。在宽格式数据中,每个观测值可能是多列的行,而长格式数据则将这些多列转换为两列:一个包含观测值的变量,另一个包含相应的值。
以下是pivot_longer的基本语法和主要参数:
pivot_longer(data, cols, names_to = NULL, values_to = "value")
- data:要转换的数据框。
- cols:要转换为长格式的列,可以是一个单独的列名,也可以是一个包含多个列名的向量。可以使用c()函数来指定多个列。
- names_to:新变量名称的列名。可以是一个字符串,或者一个包含字符串的向量,用于指定转换后的列名。
- values_to:新数值列的列名,默认为"value"。
2.starts_with()函数
starts_with()是dplyr包中的函数,用于在数据操作中筛选出以特定字符串开始的列。
以下是starts_with()函数的基本语法和参数:
starts_with(x, prefix, ignore.case = FALSE)
- x:一个字符向量,即你要检查的列。
- prefix:一个字符串,表示你想要匹配的前缀。
- ignore.case:一个逻辑值,指定是否忽略大小写进行匹配。默认为FALSE,即默认情况下是区分大小写的。
通常只需要传入参数prefix也就是想要匹配的前缀即可。这个函数不能单独使用,而是作为某些函数的参数来使用,单独使用会报这样的一个错误
说是这个函数必须配合一种selecting函数来使用,比如select函数,pivot_longer函数等。举个例子
select(df,starts_with("name"))
表示筛选出df数据框中有前缀是name的列,结果仍然是数据框。
绘制箱线图示例
首先运行代码
set.seed(10086)
exp<-matrix(round(rnorm(18),2),ncol = 6)
rownames(exp)<-paste0("gene",1:3)
colnames(exp)<-paste0("test",1:6)
exp[,1:3]<-exp[,1:3]+1
生成一个三行六列的矩阵,设置种子数是为了让产生的随机数可重复。然后对这个矩阵的行名和列名进行了修改。exp[,1:3]
其中行表示不同的基因,列表示不同的样本,对于这样一个矩阵,是不能扔到ggplot函数里面画箱线图的,因为首先函数要求的数据格式是数据框,我们得到的是矩阵,那是不是直接把这个表达矩阵转换成数据框就能扔进ggplot函数里面绘制箱线图了?我们先来看一下使用ggplot函数绘制箱线图的语法格式:
ggplot(数据框)+ geom_boxplot(aes(列名,列名))
基本的要求是数据框中两列的列名,第一个列名用作自变量(x),第二个列名用作因变量(y),再来看我们现在的矩阵,如果直接把他转换成数据框,其实内容没有变化,但是我们要怎么给geom_boxplot函数传参?传哪两列都不合适,正确处理方式如下:
1.使用t函数转置表达矩阵,并使用as.data.frame函数把这个矩阵转换成数据框。
2.使用rownames_to_column把原来的行名变成第一列,因为我们要根据基因名这一列和后面搞出来的表达量那列绘图。
3.使用mutate函数增加一列,通常命名为group,这一列的内容通常为健康和患病。这是为了在箱线图中显示图例。经过这一步之后我们的数据框如图,假设这个数据框名为dat,也可以不使用mutate函数,直接dat$group
4.使用pivot_longer函数把这个数据框“宽变长”,得到我们需要的数据框。所谓的宽变长是指:原来每个test都有其对应的gene1,2,3,现在我想要把带gene的这些列都合成一列,假设这一列叫做gene,同时要能够让test1,gene1唯一的确定一个基因表达量,就只能把test1,test2等等这些带test的每一个都变成三个,也就是下图中这样子
在这张表中我们仍然可以通过test1和gene1唯一的确定一个表达量,由于行数的变化,表达量也要用新的一列来存起来,比如表格里面的count就是我们新创建的一列。完成这一系列操作只需要使用一个函数,他就是 pivot_longer,这样传参
pdat<-dat%>%pivot_longer(cols = starts_with("gene"),names_to = "gene",values_to = "count")
管道符用于把前面的参数传到后面去,默认是传到后面函数的第一个参数位置上去。其中start_with("gene")是用来筛选出以gene开头的列,如果要筛选的基因没有这样gene1,gene2的,而是三个基因的名字,我们可以直接给cols参数写2:4,names_to=“gene”表示指定的这三列合成的新的那一列名字叫做gene,同时原来由test1和gene1这样的两个维度唯一确定的那些基因的表达量由于格式的变化也要创建新的一列来存起来,这一列我们给他起名为count。
5.使用ggplot函数绘制箱线图。
示例代码:
library(ggplot2)
ggplot(pdat,aes(gene,count))+geom_boxplot(aes(fill=group))
表示横坐标是gene这一列,纵坐标是count这一列,填充颜色由group这一列的取值来决定。
运行代码之后就绘制了这样一张图
最后送上完整源代码,可以直接运行
set.seed(10086)
exp<-matrix(round(rnorm(18),2),ncol = 6)
rownames(exp)<-paste0("gene",1:3)
colnames(exp)<-paste0("test",1:6)
exp[,1:3]<-exp[,1:3]+1
library(tidyr)
library(tibble)
library(dplyr)
dat<-t(exp)%>%as.data.frame()%>%rownames_to_column()%>%mutate(group=rep(c("control","treat"),each=3))
pdat<-dat%>%pivot_longer(cols = starts_with("gene"),names_to = "gene",values_to = "count")
library(ggplot2)
ggplot(pdat,aes(gene,count))+geom_boxplot(aes(fill=group))