筆者前一段時(shí)間忙于為新文章制作配圖,多處搜集配圖優(yōu)雅美觀的優(yōu)質(zhì)論文。最后終于找到一篇發(fā)表在 Science Advances 的文章——通過高通量測(cè)序分析揭示了小 RNA 在小鼠卵母細(xì)胞和早期胚胎中的調(diào)控作用。 文章中除了復(fù)雜的 RNA Seq、Chip Seq 分析,圖表的搭配十分美觀。雖說我們是崇高的科(ke)學(xué) (yan) 家 (gou),但關(guān)乎我們畢業(yè)大計(jì)的 SCI 也得要「高顏值」。 以常見的熱圖(heatmap)為例,在分子生物學(xué)涉及高通量以及芯片的文章中,尤其是 RNA-seq 相關(guān)論文里,熱圖是文章里經(jīng)常出現(xiàn)的數(shù)據(jù)可視化形式。 一張美觀的熱圖不僅可以直觀呈現(xiàn)多樣本、多個(gè)基因的全局表達(dá)量變化,以及多樣本或多基因表達(dá)量的聚類關(guān)系,更是如下圖般令人賞心悅目。 繪制熱圖有多種方法,常見的大家有用 MeV,各種網(wǎng)頁工具,甚至有用 Excel 再上手 PS 的??墒切』锇閭儯?1 世紀(jì)連小學(xué)生都會(huì)編程了,你咋還在用軟件做熱圖? 且不說用 Excel 出來的熱圖截圖清晰度能不能達(dá)到發(fā)文章的標(biāo)準(zhǔn),先來看看它的美觀度,筆者在這里隨機(jī)打開一個(gè)數(shù)據(jù)集,利用色階給大家用 Excel 做一下熱圖,效果如下: What?這完全沒有辦法聚類好么,我還怎么看差異變化?把這樣的熱圖給老板,別說文章涼了,能不能走出老板辦公室都是問題。 圖片來源:影視截圖 現(xiàn)在的高分論文一個(gè)個(gè)華麗麗的配圖,動(dòng)輒 R 語言、Python…聽起來就高級(jí),筆者當(dāng)年憑著中學(xué)的記憶笨笨地操作 Excel,真是苦不堪言! 老板說了,要是再做不出來滿意的圖,就滾去刷一個(gè)月錐形瓶。 于是就有小伙伴問了,沒時(shí)間系統(tǒng)地學(xué)習(xí)編程,那種「套代碼公式就能搞定 R 語言繪圖,懂中文就能會(huì)的教程」,能不能給我來一份??? 答案是肯定的了,下面就跟隨筆者,從作圖小白一步步做個(gè)初級(jí)大觸吧~ 1 基本圖繪制 吶~筆者整理出一份基礎(chǔ)教程,為了照顧零基礎(chǔ)的電腦盲同學(xué),我們從安裝 R 語言開始介紹。給大家兩個(gè)網(wǎng)址,里面詳細(xì)介紹了 R 語言 [2] 和 RStudio [3] 的安裝。 安裝好后我們打開 RStudio: > setwd('D:/workdir/') #設(shè)置工作目錄 >install.packages(“ggplot2”) #安裝 pheatmap 程序包 > library(ggplot2) #加載 ggplot2 程序包 > data <- read.csv('text.csv',header="T,row.names" =="">-> #讀取數(shù)據(jù),讀取 csv 格式數(shù)據(jù),header = T 代表首行為表頭,row.names = 1 代表首列為行名。 筆者找來一個(gè)數(shù)據(jù)集如下: 進(jìn)行完準(zhǔn)備工作后,我們開始學(xué)習(xí),基本圖的制作: (1)散點(diǎn)圖 > p <- ggplot(data,aes(x="data$TypeA,y=data$TypeB))" +="">-> # data 代表數(shù)據(jù)名,aes(x=data$TypeA,y=data$TypeB) 代表橫坐標(biāo)與縱坐標(biāo),geom_point() 可以表示繪制散點(diǎn) > p #展示結(jié)果圖 (2)折線圖 > p <- ggplot(data,aes(x="data$TypeA,y=data$TypeB))" +="" geom_line()="" +="" geom_point()="">-> # geom_line() 代表繪制折線,geom_point() 存在與否可以表示點(diǎn)的標(biāo)注。 > p (3)條形圖 (為了更直觀,筆者截取了部分?jǐn)?shù)據(jù)) > p <- ggplot(data,aes(x="data$gene_id,y=data$TypeB))" +="" geom_bar(stat='identity'>-> # geom_bar() 代表繪制直方圖。 > p (4)箱線圖 > p <- ggplot(data3,aes(x="data3$Type,y=data3$data))" +="" geom_boxplot()="">-># geom_boxplot() 代表繪制箱線圖。 > p (5)小提琴圖 > p <- ggplot(data3,aes(x="data3$Type,y=data3$data))" +="" geom_violin()="">-># geom_violin() 代表繪制小提琴圖。 > p 至此,筆者給大家?guī)砦宸N基本圖的繪制,還是簡(jiǎn)單的吧~ 2 基本圖修飾 通過上面的學(xué)習(xí),我們大致了解基本圖的繪制,所有的修飾都建立這些圖形之上,這部分給大家說說如何讓基本圖更「高大上」,通過基本圖的修飾,我們就能完成大部分的配圖模仿了。 (1)配色 對(duì)于筆者這樣直男審美的大漢來說,有一個(gè)華麗麗的配色包可謂是莫大的福利,那么 R 語言中是否有一個(gè)這樣的配色包呢? 有的,那就是 RColorBrewer。 按照前文的方式我們配置好工作目錄,加載好數(shù)據(jù)以及 ggplot2、RColorBrewer 程序包。 > display.brewer.all() #用這個(gè)命令可以生成一張圖查看本程序的調(diào)色板,如下圖所示: > p <- ggplot(data1,aes(x="data1$number1,y=data1$stage2,color=data1$stage,shape=data1$value))" +scale_color_brewer(palette='Blues' )="">-># color=data1$stage 將顏色屬性傳遞給 stage 這一列,shape=data1$value 將形狀屬性傳遞給 value 這一列,scale_color_brewer(palette = 'Blues') 使用上圖中 Blues 調(diào)色板。 > p (2)坐標(biāo)軸 坐標(biāo)軸文本修飾可以更加清晰的按照作者的意愿表達(dá),文章中的配圖坐標(biāo)軸都有明顯的修飾痕跡: 坐標(biāo)軸修飾也是通過一些基本完成命令,以修改上圖為例: > p + coord_flip() #交換 x 軸和 y 軸 > p + ylim(0,15) #如果想截取某一段可以用此命令設(shè)置值域。 > p + scale_x_continuous(breaks =seq(18,34,50) ) #設(shè)置刻度線位置 > p + theme(axis.text.x = element_text(angle = 90,family = 'Times',face = 'italic',colour = 'darkred',size=rel(0.9))) # angle = 90 設(shè)置字體角度, family = 'Times' 設(shè)置字體族, face = 'italic' 設(shè)置樣式, colour = 'darkred' 設(shè)置顏色, size=rel(0.9) 設(shè)置大小 > p + xlab('Number of data') #修改坐標(biāo)文本 (3)誤差線修飾 文章中使用了大量的誤差線條形圖: 誤差線是大家經(jīng)常需要的通常用于顯示潛在的誤差或相對(duì)于系列中每個(gè)數(shù)據(jù)標(biāo)志的不確定程度。誤差線可以用標(biāo)準(zhǔn)差 (平均偏差) 或標(biāo)準(zhǔn)誤差, 用以下這個(gè)命令可以為圖表添加誤差線: p <- ggplot(data1,aes(x="data1$gene,y=data1$FPKM,fill=data1$stage))">-> + geom_bar(position = 'dodge', stat = 'identity') #設(shè)置條形圖 [position = 'dodge'] 代表?xiàng)l形圖成簇狀分布 + geom_errorbar(aes(ymin=data1$FPKM-data1$Standard.Deviation, ymax=data1$FPKM+data1$Standard.Deviation), width=.5,position=position_dodge(.9)) #增加誤差線,誤差線高度為 FPKM ±Standard.Deviation 兩列數(shù)據(jù)都是提前計(jì)算好的。 (4)基本屬性擴(kuò)展 主題更改:我們利用基礎(chǔ)圖形命令得到下圖: > p <- ggplot(heightweight,aes(x="ageYear,y=heightIn,colour=sex))" +="">-> 下面對(duì)外觀進(jìn)行修整: ①繪圖區(qū)域選項(xiàng) > p + theme(panel.grid.major = element_line('red'),panel.grid.minor = element_line(colour = 'red',linetype='dashed',size=0.2),panel.background = element_rect(fill='lightblue'),panel.border = element_rect(colour = 'blue',fill=NA,size=2)) # panel.grid.minor = element_line(colour = 'red',linetype='dashed',size=0.2) 割線顏色,type,尺寸;panel.background = element_rect(fill='lightblue') 背景顏色,panel.border = element_rect(colour = 'blue',fill=NA,size=2)) 外框顏色,尺寸。 ②文本項(xiàng)目選項(xiàng) > p + ggtitle('Plot title here') + theme(axis.title.x = element_text(colour='red',size=14),axis.text.x = element_text(colour='blue'),axis.title.y = element_text(colour ='red',size=14,angle=90),axis.text.y=element_text(colour='blue'),plot.title=element_text(colour='red',size=20,face='bold')) # ggtitle('Plot title here') 標(biāo)題選項(xiàng);theme 主題選項(xiàng),其余為文字選項(xiàng)。 ③圖例選項(xiàng) > p + theme(legend.background = element_rect(fill='grey85',colour = 'red',size=1),legend.title = element_text(colour = 'blue',face='bold',size = 14),legend.text = element_text(colour = 'red'),legend.key = element_rect(colour = 'blue',size = 0.25)) ④分面選項(xiàng) > p + facet_grid(sex ~ .) + theme(strip.background = element_rect(fill='pink'),strip.text.y = element_text(size = 14,angle = -90,face = 'bold')) 實(shí)操結(jié)果如下: 到此為止我們已經(jīng)可以處理較為復(fù)雜的代碼了,不信你試試模仿下文章中那個(gè)高級(jí)條形圖? 本次的學(xué)習(xí)大家也可以運(yùn)用 R 語言繪制這樣的圖形,一個(gè)超長的函數(shù)也可以簡(jiǎn)單的拆分成幾個(gè)小命令: > p <- ggplot(data1,aes(x="data1$value,y=data1$number1,fill=data1$stage))">->#寫入數(shù)據(jù) +geom_bar(stat = 'identity',width = 0.6,alpha=.9) #柱狀圖基本設(shè)置 + guides(fill=guide_legend(reverse = T)) #圖例設(shè)置 +coord_flip() #反轉(zhuǎn)坐標(biāo) + theme_bw() + theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank()) + geom_hline(aes(yintercept = 0), data1,alpha=0.2) #設(shè)置主題 + labs(fill='Fold change') +ylab('Picture of text') #坐標(biāo)標(biāo)題 +scale_x_discrete(breaks = c('A','B','C','D','E','F'),labels = c('D0','D1,'D2,'D3,'D4,'D5)) #更換刻度文本 + expand_limits(y=-300) #擴(kuò)大值域 + scale_y_continuous(breaks = c(-300,-200,-100,0,100,200,300)) #增加刻度線 +scale_fill_manual (values =c('p'='#3399CC','k'='#996666','4'='#802326','3'='#c2595e','2'='#e49eaf','1.5'='#FFCCCC','-4'='#29568a','-3'='#367fc2','-2'='#79c3ec','-1.5'='#99CCFF')) #更改配色方案 到此為止相信大家可以輕松運(yùn)用 R 語言繪制基本圖以及進(jìn)行常規(guī)修飾了,終于可以和那些野雞繪圖方式說拜拜了。 圖片來源:影視截圖 什么?覺得還是不夠用?經(jīng)過兩個(gè)階段的艱苦奮戰(zhàn),大家的繪圖之路已經(jīng)爬完大半程,接下來小編將給大家?guī)?R 語言的高級(jí)繪圖。那我們廢話少說,繼續(xù)滿滿的干貨之路。 3 高級(jí)圖繪制 (1)基因熱圖 文章中運(yùn)用了大量的熱圖,熱圖在高通量分析文章中是必不可少的: 關(guān)于基因熱圖還真是讓人又愛又恨,這部分將使用專門的熱圖繪制工具給大家講解: 第一步:我們要安裝并加載繪制熱圖的程序包 >install.packages(“pheatmap”) #安裝 pheatmap 程序包 >library(pheatmap) #加載 pheatmap 程序包 第二步:設(shè)置工作目錄,也就是要分析的文件所在的位置 >setwd('D:/') #我把文件放在 D 盤,大家根據(jù)自己的情況設(shè)置 第三步:讀取文件 > heatmap.pic1 <- read.csv('text.csv',header="T,row.names" =="" 1)="">->#文件一般需要 csv 格式,其中 header = T 代表首行為表頭,row.names = 1 代表第一列是名字,不做讀取。 舉個(gè)例子,我的數(shù)據(jù)是這樣的: 第四步:繪制熱圖 pheatmap(heatmap.pic1, #載入我們的數(shù)據(jù) scale='column', #進(jìn)行均一化處理, 可以是 'row','column' 以及 'none',如果不標(biāo)志這條命令默認(rèn)是 'none' clustering_distance_rows = 'correlation', #優(yōu)化聚類線長度 treeheight_row=25, #按行聚類樹高 treeheight_col=25, #按列聚類樹高 cluster_cols=F, #是否按列聚類 cluster_rows=T, #是否按行聚類 display_numbers=F, #是否在每一格上顯示數(shù)據(jù) number_format='%.2f', #顯示數(shù)據(jù)的格式,幾位小數(shù) fontsize_row=10, #行名稱字體大小 fontsize_col=15, #列名稱字體大小 main='heatmap', #標(biāo)題名稱 gaps_row = c(10, 15), #插入縫隙,不能聚類! cutree_row = 3, #按聚類分割 show_colnames=TRUE, #是否顯示列名 show_rownames=TRUE, #是否顯示行名 color = colorRampPalette(c('green','black','red'),bias=1)(256), #定義顏色, 其中 “bias=1” 表示中間基準(zhǔn)顏色在正中間,換成其他數(shù)字可以上下調(diào),可以自己修改試試體會(huì)下?!?256)” 代表有 256 個(gè)顏色過渡,這個(gè)數(shù)字越大的話,顏色越平滑,也可以自己調(diào)節(jié)下 cellwidth = 50, #格子長度 cellheight= 14, #格子高度 border_color = 'black', #格子框顏色 legend = FALSE, #是否顯示圖例 legend_breaks = -5:5, #圖例范圍 filename = 'heatmap.pic1.pdf', #保存文件命名) 好啦,基本常用的功能已經(jīng)總結(jié)給大家了,需要大家注意的是需要?jiǎng)h掉后面的標(biāo)注,選擇自己需要的功能。以下兩圖為例: >pheatmap(heatmap.pic1,show_rownames=T,show_colnames=T,treeheight_row=20,treeheight_col=20,scale='row',cellwidth = 10,cellheight=10,cutree_row = 4) #顯示行名列名,設(shè)置樹高,,行歸一化,格子長寬為 10,按聚類分為四類,其他方面默認(rèn)處理。得到如左圖效果圖。 >pheatmap((heatmap.pic1,treeheight_row=20,,cluster_cols=FALSE,show_rownames=F,color = colorRampPalette(c('green','black','red'),bias=1)(256),scale='row') #行樹高 20,列不聚類,不顯示行名,三種顏色漸變,行歸一化。得到如右圖效果圖。 (2)火山圖 火山圖經(jīng)常用于展示差異表達(dá)的基因,常用于芯片、測(cè)序等組學(xué)檢測(cè)技術(shù)的結(jié)果中,與熱圖可是一對(duì)好兄弟: data =read.table('text.csv',header=T,row.names=1) #讀取文件 p = ggplot(data,aes(log2FC,-1*log10(symble))) + geom_point() #通過對(duì)樣品取對(duì)數(shù)歸一化處理樣品,然后繪制火山圖。 p + geom_point(aes(color =significant)) #增加點(diǎn)的顏色 p+geom_hline(yintercept=1.3)+geom_vline(xintercept=c(-1,1)) p+geom_hline(yintercept=1.3,linetype=4)+geom_vline(xintercept=c(-1,1),linetype=4) #增加閾值線,最終得到下圖。 好的,本次的「套路」給大家講完了,你是否學(xué)會(huì)應(yīng)用在你的文章里了呢~ 參考資料: [1]R Graphics Cookbook by Winston Chang(O’Reolly).Copyright2013WinstonChang,978-1-449-361695-2. [2]https://jingyan.baidu.com/article/647f0115d11aab7f2048a875.html [3]https://jingyan.baidu.com/article/7f766daf87fedf4100e1d076.html [4]Yang Q, Lin J, Miao L, et al. Highly sensitive sequencing reveals dynamic modifications and activities of small RNAs in mouse oocytes and early embryos[J]. Science Advances, 2016, 2(6):e1501482. |
|