箱線圖箱線圖是能同時(shí)反映數(shù)據(jù)統(tǒng)計(jì)量和整體分布,又很漂亮的展示圖。在2014年的Nature Method上有2篇Correspondence論述了使用箱線圖的好處和一個(gè)在線繪制箱線圖的工具。就這樣都可以發(fā)兩篇Nature method,沒天理,但也說明了箱線圖的重要意義。 下面這張圖展示了Bar plot、Box plot、Volin plot和Bean plot對數(shù)據(jù)分布的反應(yīng)。從Bar plot上只能看到數(shù)據(jù)標(biāo)準(zhǔn)差或標(biāo)準(zhǔn)誤不同;Box plot可以看到數(shù)據(jù)分布的集中性不同;Violin plot和Bean plot展示的是數(shù)據(jù)真正的分布,尤其是對Biomodal數(shù)據(jù)的展示。 Boxplot從下到上展示的是最小值,第一四分位數(shù) (箱子的下邊線)、中位數(shù) (箱子中間的線)、第三四分位數(shù) (箱子上邊線)、最大值,具體解讀參見劉永鑫的擴(kuò)增子圖表解讀1箱線圖:Alpha多樣性,老板再也不操心的我文獻(xiàn)閱讀了。 http://www./nmeth/journal/v11/n2/full/nmeth.2811.html 一步步解析箱線圖繪制假設(shè)有這么一個(gè)基因表達(dá)矩陣,第一列為基因名字,后面幾列為樣品名字,想繪制下樣品中基因表達(dá)的整體分布。 profile='Name;2cell_1;2cell_2;2cell_3;4cell_1;4cell_2;4cell_3;zygote_1;zygote_2;zygote_3 A;4;6;7;3.2;5.2;5.6;2;4;3 B;6;8;9;5.2;7.2;7.6;4;6;5 C;8;10;11;7.2;9.2;9.6;6;8;7 D;10;12;13;9.2;11.2;11.6;8;10;9 E;12;14;15;11.2;13.2;13.6;10;12;11 F;14;16;17;13.2;15.2;15.6;12;14;13 G;15;17;18;14.2;16.2;16.6;13;15;14 H;16;18;19;15.2;17.2;17.6;14;16;15 I;17;19;20;16.2;18.2;18.6;15;17;16 J;18;20;21;17.2;19.2;19.6;16;18;17 L;19;21;22;18.2;20.2;20.6;17;19;18 M;20;22;23;19.2;21.2;21.6;18;20;19 N;21;23;24;20.2;22.2;22.6;19;21;20 O;22;24;25;21.2;23.2;23.6;20;22;21'
讀入數(shù)據(jù)并轉(zhuǎn)換為ggplot2需要的長數(shù)據(jù)表格式 (經(jīng)過前面幾篇的練習(xí),這應(yīng)該都很熟了) profile_text <- read.table(text="profile," header="">->T, row.names=1, quote='',sep=';', check.names=F) # 在melt時(shí)保留位置信息 # melt格式是ggplot2畫圖最喜歡的格式 # 好好體會下這個(gè)格式,雖然多占用了不少空間,但是確實(shí)很方便
library(ggplot2) library(reshape2) data_m <->-> head(data_m)
variable value1 2cell_1 42 2cell_1 63 2cell_1 84 2cell_1 105 2cell_1 126 2cell_1 14
像往常一樣,就可以直接畫圖了。 # variable和value為矩陣melt后的兩列的名字,內(nèi)部變量, variable代表了點(diǎn)線的屬性,value代表對應(yīng)的值。 p <- ggplot(data_m,="" aes(x="variable," y="value),color=variable)" +="">-> geom_boxplot() + theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) + theme(legend.position='none') p # 圖會存儲在當(dāng)前目錄的Rplots.pdf文件中,如果用Rstudio,可以不運(yùn)行dev.off() dev.off()
箱線圖出來了,看上去還可以,再加點(diǎn)色彩。 # variable和value為矩陣melt后的兩列的名字,內(nèi)部變量, variable代表了點(diǎn)線的屬性,value代表對應(yīng)的值。 p <- ggplot(data_m,="" aes(x="variable," y="value),color=variable)" +="">-> geom_boxplot(aes(fill=factor(variable))) + theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) + theme(legend.position='none') p # 圖會存儲在當(dāng)前目錄的Rplots.pdf文件中,如果用Rstudio,可以不運(yùn)行dev.off() dev.off()
再看看Violin plot # variable和value為矩陣melt后的兩列的名字,內(nèi)部變量, variable代表了點(diǎn)線的屬性,value代表對應(yīng)的值。 p <- ggplot(data_m,="" aes(x="variable," y="value),color=variable)" +="">-> geom_violin(aes(fill=factor(variable))) + theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) + theme(legend.position='none') p # 圖會存儲在當(dāng)前目錄的Rplots.pdf文件中,如果用Rstudio,可以不運(yùn)行dev.off() dev.off()
還有Jitter plot (這里使用的是ggbeeswarm包) library(ggbeeswarm) # 為了更好的效果,只保留其中一個(gè)樣品的數(shù)據(jù) # grepl類似于Linux的grep命令,獲取特定模式的字符串
data_m2 <->->'_3', data_m$variable),]
# variable和value為矩陣melt后的兩列的名字,內(nèi)部變量, variable代表了點(diǎn)線的屬性,value代表對應(yīng)的值。 p <- ggplot(data_m2,="" aes(x="variable," y="value),color=variable)" +="">-> geom_quasirandom(aes(colour=factor(variable))) + theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.key=element_blank()) + theme(legend.position='none') # 也可以用geom_jitter(aes(colour=factor(variable)))代替geom_quasirandom(aes(colour=factor(variable))) # 但個(gè)人認(rèn)為geom_quasirandom給出的結(jié)果更有特色
ggsave(p, filename='jitterplot.pdf', width=14, height=8, units=c('cm'))
繪制單個(gè)基因 (A)的箱線圖為了更好的展示效果,下面的矩陣增加了樣品數(shù)量和樣品的分組信息。 profile='Name;2cell_1;2cell_2;2cell_3;2cell_4;2cell_5;2cell_6;4cell_1;4cell_2;4cell_3;4cell_4;4cell_5;4cell_6;zygote_1;zygote_2;zygote_3;zygote_4;zygote_5;zygote_6 A;4;6;7;5;8;6;3.2;5.2;5.6;3.6;7.6;4.8;2;4;3;2;4;2.5 B;6;8;9;7;10;8;5.2;7.2;7.6;5.6;9.6;6.8;4;6;5;4;6;4.5'
profile_text <- read.table(text="profile," header="">->T, row.names=1, quote='',sep=';', check.names=F)
data_m = data.frame(t(profile_text['A',])) data_m$sample = rownames(data_m) # 只挑選顯示部分 # grepl前面已經(jīng)講過用于匹配 data_m[grepl('_[123]', data_m$sample),]
A sample2cell_1 4.0 2cell_12cell_2 6.0 2cell_22cell_3 7.0 2cell_34cell_1 3.2 4cell_14cell_2 5.2 4cell_24cell_3 5.6 4cell_3zygote_1 2.0 zygote_1zygote_2 4.0 zygote_2zygote_3 3.0 zygote_3
獲得樣品分組信息 (這個(gè)例子比較特殊,樣品的分組信息就是樣品名字下劃線前面的部分) # 可以利用strsplit分割,取出其前面的字符串 # R中復(fù)雜的輸出結(jié)果多數(shù)以列表的形式體現(xiàn),在之前的矩陣操作教程中 # 提到過用str函數(shù)來查看復(fù)雜結(jié)果的結(jié)構(gòu),并從中獲取信息 group = unlist(lapply(strsplit(data_m$sample,'_'), function(x) x[1])) data_m$group = group data_m[grepl('_[123]', data_m$sample),]
A sample group2cell_1 4.0 2cell_1 2cell2cell_2 6.0 2cell_2 2cell2cell_3 7.0 2cell_3 2cell4cell_1 3.2 4cell_1 4cell4cell_2 5.2 4cell_2 4cell4cell_3 5.6 4cell_3 4cellzygote_1 2.0 zygote_1 zygotezygote_2 4.0 zygote_2 zygotezygote_3 3.0 zygote_3 zygote
如果沒有這個(gè)規(guī)律,也可以提到類似于下面的文件,指定樣品所屬的組的信息。 sampleGroup_text='Sample;Group zygote_1;zygote zygote_2;zygote zygote_3;zygote zygote_4;zygote zygote_5;zygote zygote_6;zygote 2cell_1;2cell 2cell_2;2cell 2cell_3;2cell 2cell_4;2cell 2cell_5;2cell 2cell_6;2cell 4cell_1;4cell 4cell_2;4cell 4cell_3;4cell 4cell_4;4cell 4cell_5;4cell 4cell_6;4cell'
#sampleGroup = read.table(text=sampleGroup_text,sep='\t',header=1,check.names=F,row.names=1)
#data_m <- merge(data_m,="" samplegroup,="" by='row.names'>->
# 會獲得相同的結(jié)果,腳本注釋掉了以免重復(fù)執(zhí)行引起問題。
矩陣準(zhǔn)備好了,開始畫圖了 (小提琴圖做例子,其它類似) # 調(diào)整下樣品出現(xiàn)的順序 data_m$group <- factor(data_m$group,="" levels="">->'zygote','2cell','4cell')) # group和A為矩陣中兩列的名字,group代表了值的屬性,A代表基因A對應(yīng)的表達(dá)值。 # 注意看修改了的地方 p <- ggplot(data_m,="" aes(x="group," y="A),color=group)" +="">-> geom_violin(aes(fill=factor(group))) + theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) + theme(legend.position='none') p # 圖會存儲在當(dāng)前目錄的Rplots.pdf文件中,如果用Rstudio,可以不運(yùn)行dev.off()
長矩陣?yán)L制箱線圖常規(guī)矩陣?yán)L制箱線圖要求必須是個(gè)方正的矩陣輸入,而有時(shí)想比較的幾個(gè)組里面檢測的值數(shù)目不同。比如有三個(gè)組,GrpA組檢測了6個(gè)病人,GrpB組檢測了10個(gè)病人,GrpC組是12個(gè)正常人的檢測數(shù)據(jù)。這時(shí)就很難形成一個(gè)行位檢測值,列為樣品的矩陣,長表格模式就適合與這種情況。 long_table <->->'Grp;Value GrpA;10 GrpA;11 GrpA;12 GrpB;5 GrpB;4 GrpB;3 GrpB;2 GrpC;2 GrpC;3'
long_table <- read.table(text="">->'\t',header=1,check.names=F)
p <- ggplot(data_m,="" aes(x="Grp," y="Value),color=Grp)" +="">-> geom_violin(aes(fill=factor(Grp))) + theme(axis.text.x=element_text(angle=50,hjust=0.5, vjust=0.5)) + theme(legend.position='none') p dev.off()
長表格形式自身就是常規(guī)矩陣melt后的格式,這種用來繪制箱線圖就很簡單了,就不做解釋了。 R繪圖學(xué)習(xí)R語言學(xué)習(xí) - 入門環(huán)境Rstudio R語言學(xué)習(xí) - 熱圖繪制 (heatmap) R語言學(xué)習(xí) - 基礎(chǔ)概念和矩陣操作 R語言學(xué)習(xí) - 熱圖美化 R語言學(xué)習(xí) - 熱圖簡化 R語言學(xué)習(xí) - 線圖繪制 R語言學(xué)習(xí) - 線圖一步法 文章集錦Linux學(xué)習(xí) R統(tǒng)計(jì)繪圖 Python教程 Perl學(xué)習(xí) 生信傻瓜 NGS持續(xù)更新中 (鏈接失效,點(diǎn)擊菜單知識庫查看) 學(xué)習(xí)生信,長按關(guān)注 學(xué)習(xí)宏基因組,長按關(guān)注
|