上篇測(cè)試了如何用plot來(lái)實(shí)現(xiàn)火山圖笋敞,其實(shí)通常還是強(qiáng)大的ggplot包實(shí)現(xiàn)更好夯巷。
還是用上一篇的測(cè)試數(shù)據(jù)喷兼。
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"))
注:因?yàn)檫@個(gè)測(cè)試數(shù)據(jù)中阶牍,用戶已經(jīng)自己定義了那些是up和down走孽。如果沒(méi)有的話磕瓷,自己也可以添加1列來(lái)定義
先測(cè)試,最簡(jiǎn)單的一個(gè)ggplot的命令硕盹。ggplot()用于構(gòu)造初始的plot對(duì)象瘩例,一般總是后跟+以向plot添加組件。比如今天用到的就是geom_point聘惦,添加點(diǎn)善绎,當(dāng)然也可以有線,條比勉,箱線圖和陰影區(qū)域浩聋。這個(gè)例子我們是通過(guò)geom_point()函數(shù)望ggplot()創(chuàng)建的plot對(duì)象中添加一些列的點(diǎn)衣洁。
ggplot(data, aes(log2FoldChange,-log10(pvalue)))+geom_point()
上面這個(gè)就是最簡(jiǎn)單的ggplot的呈現(xiàn)砖第。ggplot()初始呈現(xiàn)中,要指定數(shù)據(jù)來(lái)源(data)羽杰,以及變量(log2FoldChange考赛,pvalue)颜骤,變量主要通過(guò)aes來(lái)實(shí)現(xiàn)。在這里默認(rèn)情況下log2FoldChange映射到X軸,-log10(pvalue)映射到Y(jié)軸益涧,當(dāng)然也可以aes(x=log2FoldChange,y=-log10(pvalue))闲询。
當(dāng)然,我們還可以在geom_point函數(shù)中設(shè)置點(diǎn)的形狀(pch)鸽捻,大杏选(size),顏色(color)等碘箍。
ggplot(data, aes(log2FoldChange,-log10(pvalue)))+geom_point(size = 2,aes(color = regulate))
上面這個(gè)圖就是設(shè)置完大小货邓,color用用戶指定的regulate里面的up/down來(lái)進(jìn)行顏色劃分逻恐。(當(dāng)然,也可以在ggplot里面的aes指定color挽拂,比如這個(gè)效果ggplot(data, aes(x=log2FoldChange,y=-log10(pvalue),color=regulate))+geom_point()? ?和上面也是差不多的)
下面來(lái)操作添加火山圖的參考線亏栈,主要通過(guò)geom_hline和geom_vline來(lái)實(shí)現(xiàn)添加水平和垂直的添加線。其中l(wèi)inetype和size分別來(lái)控制線的類型和大小闷游。
scale_x_continuous和scale_y_continuous主要用來(lái)控制坐標(biāo)軸刻度線脐往;例如可以通過(guò)參數(shù)breaks來(lái)指定刻度標(biāo)記业簿,limits來(lái)控制x和y軸坐標(biāo)的范圍,lables來(lái)指定刻度標(biāo)記標(biāo)簽克饶。xlab和ylab來(lái)控制坐標(biāo)的名字矾湃。
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的畫(huà)法一樣途戒,我們可能還需要highlight top的一些candidates,比如上調(diào)或者下調(diào)top5星爪,并顯示其名字。主要通過(guò)geom_label_repel函數(shù)來(lái)控制抄肖。
我們需要先挑出top的gene。挑選方法幌甘,我們用R里面的%>%通道符來(lái)實(shí)現(xiàn)鞍泉。
data %>%filter(regulate == 'Up') %>%arrange(pvalue,desc(abs(log2FoldChange))) %>%head(5)
分別是基于data,篩選regulate等于Up的gene托修,然后按照pvalue升序以及l(fā)og2FoldChange絕對(duì)值降序來(lái)排序,最后選出top 5的gene所在的行涩拙。
結(jié)果如下所示:
同樣的我們對(duì)于down的也可以進(jìn)行這樣的操作:
data %>%filter(regulate == 'Down') %>%arrange(pvalue,desc(abs(log2FoldChange))) %>%head(5)
然后合并Up和down的結(jié)果,R里面可以用bind_rows來(lái)實(shí)現(xiàn)如绸,顧名思義就是合并這2個(gè)結(jié)果中的所有行。
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的結(jié)果如下圖所示:
然后把top個(gè)gene用geom_label_repel函數(shù)添加上去:
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)
到這里谎势,火山圖的基本形狀就出來(lái)了脏榆,但是這里還有幾個(gè)問(wèn)題:一般情況下legend的排序那里都是先Up/Normal/Down,這個(gè)原因是R一般處理這些字符性質(zhì)的變量的時(shí)候是按照ASCII順序來(lái)實(shí)現(xiàn)的,我們自己就需要通過(guò)factor來(lái)手動(dòng)的調(diào)整他們的順序?yàn)槲覀兺ǔR饬x上的順序是己;
data$regulate <- factor(data$regulate,order=TRUE,levels=c("Up","Normal","Down"))
把regulate列設(shè)置成為了因子,并且人為指定了它們的排序方式摔认。從數(shù)據(jù)查看來(lái)看,regulate已經(jīng)有了相應(yīng)的順序辰企。
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"))
從圖中來(lái)看镐捧,順序已經(jīng)按照我們想要的順序排列了竹习。但是顏色目前采取的是R里面默認(rèn)的,當(dāng)我把regulate改成因子變量后泌辫,他們就又映射到了另外一個(gè)默認(rèn)的顏色空間。所以一般需要我們自己設(shè)置顏色殿遂,比如,我們想把顏色改成Up紅色饵溅,Down藍(lán)色咬荷,Normal灰色懦底。
一般通過(guò)scale_color_manual函數(shù)丐重,人為的指定相應(yīng)的顏色,我選了紅崖蜜,灰,藍(lán)色三種顏色等恐。
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)
可以看出星著,調(diào)整后的顏色就是我們想要的顏色了同欠。
但是,雖然整體該有的都有的,還是覺(jué)得坐標(biāo)軸等的字體有點(diǎn)小粮坞,需要調(diào)整字體顯得更清晰一些,字體調(diào)整一般是通過(guò)控制theme()來(lái)實(shí)現(xiàn)的筝闹。
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))
這個(gè)就是對(duì)圖中所有字體都調(diào)整了。
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))
像這個(gè)就只改變坐標(biāo)軸上的字體,當(dāng)然也可以通過(guò)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))
這樣的話,就只調(diào)控坐標(biāo)軸名稱的大小,當(dāng)然也可以通過(guò)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))
通過(guò)legend.text 和legend.title來(lái)控制圖例上面的文字和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))