上篇测试了如何用plot来实现火山图,其实通常还是强大的ggplot包实现更好。
还是用上一篇的测试数据。
library(ggplot2)
library(dplyr)
library(ggrepel)
data <- read.csv("DEG.csv",row.names=1)
##data$regulate<-ifelse(data$log2FoldChange >= 0.5 & data$pvalue < 0.05,"Up",
ifelse(data$log2FoldChange <=-0.5 & data$pvalue < 0.05,"Down","Normal"))
注:因为这个测试数据中,用户已经自己定义了那些是up和down。如果没有的话,自己也可以添加1列来定义
先测试,最简单的一个ggplot的命令。ggplot()用于构造初始的plot对象,一般总是后跟+以向plot添加组件。比如今天用到的就是geom_point,添加点,当然也可以有线,条,箱线图和阴影区域。这个例子我们是通过geom_point()函数望ggplot()创建的plot对象中添加一些列的点。
ggplot(data, aes(log2FoldChange,-log10(pvalue)))+geom_point()
上面这个就是最简单的ggplot的呈现。ggplot()初始呈现中,要指定数据来源(data),以及变量(log2FoldChange,pvalue),变量主要通过aes来实现。在这里默认情况下log2FoldChange映射到X轴,-log10(pvalue)映射到Y轴,当然也可以aes(x=log2FoldChange,y=-log10(pvalue))。
当然,我们还可以在geom_point函数中设置点的形状(pch),大小(size),颜色(color)等。
ggplot(data, aes(log2FoldChange,-log10(pvalue)))+geom_point(size = 2,aes(color = regulate))
上面这个图就是设置完大小,color用用户指定的regulate里面的up/down来进行颜色划分。(当然,也可以在ggplot里面的aes指定color,比如这个效果ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue),color=regulate))+geom_point() 和上面也是差不多的)
下面来操作添加火山图的参考线,主要通过geom_hline和geom_vline来实现添加水平和垂直的添加线。其中linetype和size分别来控制线的类型和大小。
scale_x_continuous和scale_y_continuous主要用来控制坐标轴刻度线;例如可以通过参数breaks来指定刻度标记,limits来控制x和y轴坐标的范围,lables来指定刻度标记标签。xlab和ylab来控制坐标的名字。
ggplot(data, aes(log2FoldChange,-log10(pvalue)))+geom_point(size = 2,aes(color = regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))
最后,像plot的画法一样,我们可能还需要highlight top的一些candidates,比如上调或者下调top5,并显示其名字。主要通过geom_label_repel函数来控制。
我们需要先挑出top的gene。挑选方法,我们用R里面的%>%通道符来实现。
data %>%filter(regulate == 'Up') %>%arrange(pvalue,desc(abs(log2FoldChange))) %>%head(5)
分别是基于data,筛选regulate等于Up的gene,然后按照pvalue升序以及log2FoldChange绝对值降序来排序,最后选出top 5的gene所在的行。
结果如下所示:
同样的我们对于down的也可以进行这样的操作:
data %>%filter(regulate == 'Down') %>%arrange(pvalue,desc(abs(log2FoldChange))) %>%head(5)
然后合并Up和down的结果,R里面可以用bind_rows来实现,顾名思义就是合并这2个结果中的所有行。
top<- bind_rows(
data %>%filter(regulate == 'Up') %>%arrange(pvalue,desc(abs(log2FoldChange))) %>% head(5),
data %>%filter(regulate == 'Down') %>%arrange(pvalue,desc(abs(log2FoldChange))) %>%head(5)
)
最终top的结果如下图所示:
然后把top个gene用geom_label_repel函数添加上去:
ggplot(data, aes(log2FoldChange,-log10(pvalue)))+geom_point(size = 2,aes(color = regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
geom_label_repel(data = top,aes(log2FoldChange, -log10(pvalue), label = row),size = 4)
到这里,火山图的基本形状就出来了,但是这里还有几个问题:一般情况下legend的排序那里都是先Up/Normal/Down,这个原因是R一般处理这些字符性质的变量的时候是按照ASCII顺序来实现的,我们自己就需要通过factor来手动的调整他们的顺序为我们通常意义上的顺序;
data$regulate <- factor(data$regulate,order=TRUE,levels=c("Up","Normal","Down"))
把regulate列设置成为了因子,并且人为指定了它们的排序方式。从数据查看来看,regulate已经有了相应的顺序。
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue),color=regulate))+geom_point(size = 2)+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))
从图中来看,顺序已经按照我们想要的顺序排列了。但是颜色目前采取的是R里面默认的,当我把regulate改成因子变量后,他们就又映射到了另外一个默认的颜色空间。所以一般需要我们自己设置颜色,比如,我们想把颜色改成Up红色,Down蓝色,Normal灰色。
一般通过scale_color_manual函数,人为的指定相应的颜色,我选了红,灰,蓝色三种颜色。
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue)))+geom_point(size = 2,aes(color=regulate))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
scale_color_manual(values=c("#FC4E07", "#C0C0C0","#0000FF"),name="Expression")+
geom_label_repel(data=top,aes(x=log2FoldChange, y=-log10(pvalue), label = row),size = 4)
可以看出,调整后的颜色就是我们想要的颜色了。
但是,虽然整体该有的都有的,还是觉得坐标轴等的字体有点小,需要调整字体显得更清晰一些,字体调整一般是通过控制theme()来实现的。
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue)))+geom_point(size = 2,aes(color=regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
scale_color_manual(values=c("#FC4E07", "#C0C0C0","#0000FF"),name="Expression")+
geom_label_repel(data=top,aes(x=log2FoldChange, y=-log10(pvalue), label = row),size = 4)+
theme(text = element_text(size = 20))
这个就是对图中所有字体都调整了。
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue)))+geom_point(size = 2,aes(color=regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
scale_color_manual(values=c("#FC4E07", "#C0C0C0","#0000FF"),name="Expression")+
geom_label_repel(data=top,aes(x=log2FoldChange, y=-log10(pvalue), label = row),size = 4)+
theme(axis.text = element_text(size = 20))
像这个就只改变坐标轴上的字体,当然也可以通过axis.text.x和axis.text.y分别改变X和Y轴。
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue)))+geom_point(size = 2,aes(color=regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
scale_color_manual(values=c("#FC4E07", "#C0C0C0","#0000FF"),name="Expression")+
geom_label_repel(data=top,aes(x=log2FoldChange, y=-log10(pvalue), label = row),size = 4)+
theme(axis.title = element_text(size = 30))
这样的话,就只调控坐标轴名称的大小,当然也可以通过axis.title.x/y分别改变x和y上的。
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue)))+geom_point(size = 2,aes(color=regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
scale_color_manual(values=c("#FC4E07", "#C0C0C0","#0000FF"),name="Expression")+
geom_label_repel(data=top,aes(x=log2FoldChange, y=-log10(pvalue), label = row),size = 4)+
theme(legend.text = element_text(size = 20))+
theme(legend.title = element_text(size = 20))
通过legend.text 和legend.title来控制图例上面的文字和title
ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue)))+geom_point(size = 2,aes(color=regulate))+
scale_x_continuous(limits = c(-7, 7))+
scale_y_continuous(limits = c(0, 32))+
geom_hline(yintercept=-log10(0.05),linetype=4)+
geom_vline(xintercept=c(-0.5,0.5),linetype=4)+
xlab(expression("log"[2]*" fold change"))+
ylab(expression("-log"[10]*" p-value"))+
scale_color_manual(values=c("#FC4E07", "#C0C0C0","#0000FF"),name="Expression")+
geom_label_repel(data=top,aes(x=log2FoldChange, y=-log10(pvalue), label = row),size = 4)+
theme(legend.text = element_text(size = 20))+
theme(legend.title = element_text(size = 20))+
theme(axis.title = element_text(size = 20))+
theme(axis.text = element_text(size = 15))