在火山圖上標記基因

要玩圖勋篓,離不開哈德雷大神的《R數(shù)據(jù)科學》梢杭,第1章和21章是專門講圖的宜狐,我寫過對應的筆記:
http://www.reibang.com/p/4a154f6f0de7
http://www.reibang.com/p/bf0f12246865

關于火山圖加標簽的需求盒延,這里有幾種方法來實現(xiàn)节槐。

示例數(shù)據(jù)

方法一的示例數(shù)據(jù)是data.Rdata酒唉,方法二三的示例數(shù)據(jù)是test.Rdata旱眯。我將數(shù)據(jù)打包放在了“生信星球”公眾號后臺喂链,回復“火山圖”即可獲得铐姚。你解壓后雙擊文件夾里的volcano.Rproj策肝,復制粘貼運行本文代碼即可。


方法一:利用空字符串“”

原理:空字符串“”=nothing

關于空字符串谦屑,我曾寫過一篇文章來講他:http://www.reibang.com/p/aef98f3fc7d8

這種方法的參照是幫助文檔里的一段代碼:
(先準備好包)

if(!require(ggplot2)) install.packages("ggplot2")
if(!require(ggrepel)) install.packages("ggrepel")
if(!require(dplyr))install.packages("dplyr")
library(ggplot2)
library(ggrepel)
library(dplyr)

代碼來源

下面代碼來源于geom_text_repel的幫助文檔

p <- ggplot(mtcars,
            aes(wt, mpg, label = rownames(mtcars), colour = factor(cyl))) +
  geom_point()
# Hide some of the labels, but repel from all data points
mtcars$label <- rownames(mtcars)
mtcars$label[1:15] <- ""
p + geom_text_repel(data = mtcars, aes(wt, mpg, label = label))

做出的圖是這樣:



可以看到驳糯,一部分點有標簽, 一部分沒有氢橙,思路就是把不要標簽的部分變成空字符串“”酝枢。

學以致用

火山圖的本質就是點圖,那么在火山圖上標記部分基因悍手,就是在點圖上標記部分點帘睦。

參考這個思路為火山圖加標簽:

(美圖預警)

step1:先把圖畫出來

load("data.Rdata")
head(data)
#       symbol     p.value        FC change 
#1            PCMTD2 1.53544e-11 1.3548360 Stable      
#2                KIAA0087 6.71382e-13 0.7314603 Stable      
#3                 AFAP1L1 4.24611e-12 0.6284560 Stable      
#4                  CHMP1A 3.76821e-09 1.6035994 Stable      
#5                  TRERF1 1.80652e-08 0.6875469 Stable      
#6                     C8B 7.88047e-04 1.2374303 Stable      
data$change = ifelse(data$p.value < 0.000001 & abs(log2(data$FC)) >= 1, 
                        ifelse(log2(data$FC)> 1 ,'Up','Down'),
                        'Stable')

p <- ggplot(data = data, 
         aes(x = log2(data$FC), 
             y = -log10(data$p.value), 
             colour=change,
             label = data$symbol)) +
  geom_point(alpha=0.4, size=3.5) +
  scale_color_manual(values=c("blue", "grey","red"))+
  xlim(c(-4.5, 4.5)) +
  geom_vline(xintercept=c(-1,1),lty=4,col="black",lwd=0.8) +
  geom_hline(yintercept = -log10(0.000001),lty=4,col="black",lwd=0.8) +
  labs(x="log2(fold change)",
       y="-log10 (p-value)",
       title="Differential metabolites")  +
  theme_bw()+
  theme(plot.title = element_text(hjust = 0.5), 
        legend.position="right", 
        legend.title = element_blank())
p

step2:篩選部分基因,用于顯示在圖上

想在圖上做修改坦康,一半是調參數(shù)竣付,一半是調數(shù)據(jù)。我們現(xiàn)在要做的就是調數(shù)據(jù):要標記的滞欠,label=基因古胆,無需標記的,label=“”。

?重點就在這里:

data$label=ifelse(data$p.value < 0.000001 & abs(log2(data$FC)) >= 1,data$symbol,"")

step3:將文字圖層疊加上去

p+geom_text_repel(data = data, aes(x = log2(data$FC), 
                                   y = -log10(data$p.value), 
                                   label = label),
                      size = 3,box.padding = unit(0.5, "lines"),
                      point.padding = unit(0.8, "lines"), 
                      segment.color = "black", 
                      show.legend = FALSE)

但是我發(fā)現(xiàn)逸绎,這個只是適用于數(shù)據(jù)量比較小的時候惹恃,這個例子只有170個點,而一般來說火山圖數(shù)以萬計的行棺牧,用這個方法容易失敗巫糙。下午嘗試了幾次大的數(shù)據(jù),結果Rstudio無一例外的嘎嘣了颊乘。

方法二:看R數(shù)據(jù)科學

代碼來源

以下代碼出自R數(shù)據(jù)科學筆記第21章参淹,原書第312頁:

best_in_class <- mpg %>%
  group_by(class) %>%
  filter(row_number(desc(hwy)) == 1)

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class)) +
  geom_point(size = 3, shape = 1, data = best_in_class) +
  ggrepel::geom_label_repel(
    aes(label = model),
    data = best_in_class
  )

這個方法適用于較大的數(shù)據(jù)。

端詳代碼找思路

1.從原來數(shù)據(jù)中挑選了一部分乏悄,生成新數(shù)據(jù)
2.用新數(shù)據(jù)作圖浙值,向原數(shù)據(jù)做的點圖上疊加兩個圖層,一個空心點圖纲爸,一個geom_label_repel亥鸠。

step1:先把火山圖畫出

load("test.Rdata")
p <- ggplot(data = test, 
            aes(x = logFC, 
                y = `-log10(P.value)`)) +
  geom_point(alpha=0.4, size=3.5, 
             aes(color=change)) +
  scale_color_manual(values=c("blue", "grey","red"))+
  geom_vline(xintercept=c(-1,1),lty=4,col="black",lwd=0.8) +
  geom_hline(yintercept = -log10(0.01),lty=4,col="black",lwd=0.8) +
  theme_bw()
p

step2:生成用于添加圖層的新數(shù)據(jù)

?重點在這里

新數(shù)據(jù)框的內容是你想要標記的基因,這里根據(jù)logFC和Pvalue的大小來篩選识啦,可以自定義閾值來調整要顯示的基因的數(shù)量:


for_label <- test %>% 
  filter(abs(logFC) >4& `-log10(P.value)`> -log10(0.000001))

step3:新圖層疊加到原圖上去

p +
  geom_point(size = 3, shape = 1, data = for_label) +
  ggrepel::geom_label_repel(
    aes(label = symbol),
    data = for_label,
    color="black"
  )

加號連接兩句代碼就實現(xiàn)了圖層的疊加负蚊,如果對ggplot2不了解,請看R數(shù)據(jù)科學第一章和第21章颓哮。但21章是整本書的錯誤重災區(qū)家妆,請看我的筆記有改正后的代碼。

方法三:ggpubr的函數(shù)有現(xiàn)成的參數(shù)

這個函數(shù)叫ggscatter冕茅,還是用剛才的test數(shù)據(jù)來做伤极。

代碼來源

網易云課堂的GEO數(shù)據(jù)庫挖掘實戰(zhàn)演練視頻


https://study.163.com/course/introduction.htm?courseId=1005840004&share=2&shareId=400000000562025#/courseDetail?tab=1

由于ggpubr寫縱坐標時直接寫-log10(P.value)不識別,可采取迂回策略姨伤,改列名哨坪,完事再在圖上改縱軸標簽。

load("test.Rdata")
if(!require(ggpubr))install.packages("ggpubr")
library(ggpubr)
colnames(test)[4] <- "v"
ggscatter(test, 
          x = "logFC", 
          y ="v",
          ylab="-log10(P.value)",
          size=0.5,
          color = "change",
          palette = c("#00AFBB", "#999999", "#FC4E07") 
          )

然后加標簽乍楚,是現(xiàn)成的參數(shù)“l(fā)abel.select”当编。接受的參數(shù)數(shù)據(jù)結構應該是向量。

可以手動選一二三四個感興趣的基因

ggscatter(test, 
          x = "logFC", 
          y = "v", 
          ylab="-log10(P.value)",
          color = "change",
          size = 0.5,
          label = "symbol", 
          repel = T,
          palette = c("#00AFBB", "#999999", "#FC4E07") ,
          #label.select = dat$symbol[1:30] ,
          label.select = c("CD36", "DUSP6", "DCT", "SPRY2", "MOXD1", "ETV4" )
          )

也可以用向量取子集的方法來取很多個

比如差異基因前30個

ggscatter(test, 
          x = "logFC", 
          y = "v", 
          ylab="-log10(P.value)",
          color = "change",
          size = 0.5,
          label = "symbol", 
          repel = T,
          palette = c("#00AFBB", "#999999", "#FC4E07") ,
          label.select = test$symbol[1:30]
          )
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末徒溪,一起剝皮案震驚了整個濱河市忿偷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臊泌,老刑警劉巖鲤桥,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渠概,居然都是意外死亡茶凳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慧妄,“玉大人顷牌,你說我怎么就攤上這事∪停” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵罪裹,是天一觀的道長饱普。 經常有香客問我,道長状共,這世上最難降的妖魔是什么套耕? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮峡继,結果婚禮上冯袍,老公的妹妹穿的比我還像新娘。我一直安慰自己碾牌,他們只是感情好康愤,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舶吗,像睡著了一般征冷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上誓琼,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天检激,我揣著相機與錄音,去河邊找鬼腹侣。 笑死叔收,一個胖子當著我的面吹牛,可吹牛的內容都是我干的傲隶。 我是一名探鬼主播饺律,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伦籍!你這毒婦竟也來了蓝晒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帖鸦,失蹤者是張志新(化名)和其女友劉穎芝薇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體作儿,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡洛二,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晾嘶。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妓雾,死狀恐怖,靈堂內的尸體忽然破棺而出垒迂,到底是詐尸還是另有隱情械姻,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布机断,位于F島的核電站楷拳,受9級特大地震影響,放射性物質發(fā)生泄漏吏奸。R本人自食惡果不足惜欢揖,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奋蔚。 院中可真熱鬧她混,春花似錦、人聲如沸泊碑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾狗。三九已至晋涣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沉桌,已是汗流浹背谢鹊。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留留凭,地道東北人佃扼。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蔼夜,于是被迫代替她去往敵國和親兼耀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353