一?導言
共線性圖作為新近出現的一種數據可視化方式,以其直觀、形象的方式受到大家的普遍歡迎,也在眾多文章中獲得了應用。該圖的核心理念就是將不同時期間同一批數據的關系connect起來,即不同階段中所有樣品在眾多分類間的流動情況(流動或許表述的不是那么準確,但的確是這樣一種形式)??紤]到部分讀者對這種圖的需求,因此本推文將以代碼加解說的方式展示如何進行這類圖片的繪制(有沒有很貼心)。
二?R包使用
首先,我們需要做的就是加載對應的R包
library(ggalluvial)
隨后,設置命令行參數的意義。這里是為了方便后續(xù)直接調用,其中argfilename是筆者放置參數的文件。
Args <- commandArgs()
inputfilename<-Args[6]
argfilename<-Args[7]
outputfilename<-Args[8]
劃重點:這里需要強調一下輸入文件(inputfilename)的格式及其對應的意義。其中survey用于表示不同的時期,subject表示相應的樣品編號,response則表示該樣品編號在survey時期應該歸屬于哪個respones種類中。下文文件僅展示部分。
survey freq subject response
ms153_NSA 48 1 Always
ms153_NSA 9 2 Always
ms153_NSA 66 3 Always
ms153_NSA 1 4 Always
ms153_NSA 11 5 Always
ms153_NSA 1 6 Always
ms153_NSA 5 7 Always
ms153_NSA 4 8 Always
ms153_NSA 24 9 Missing
對應的參數文件為
pic_height_num 2400
pic_width_num 2400
pic_res_num 300
col_type transparent
alpha_size 0.5
cex_size 0.7
cat_cex_size 0.7
margin_size 0.05
rotation_degree_num 0
list_name_1 list1
list_name_2 list2
list_name_3 list3
list_name_4 list4
list_name_5 list5
colour_1 blue
colour_2 green
colour_3 yellow
colour_4 purple
colour_5 red
mar_1_size 0
mar_2_size 0
mar_3_size 0
mar_4_size 0
其次,通過命令行參數讀取對應的數據
alluvial_table=read.csv(inputfilename, sep="\t", row.names=None)plot_args<-read.table(argfilename,sep="\t",header=F,row.names?=?1)
對于輸出圖片而言,我們需要的是確定輸出圖片的長、寬、像素、邊界的大?。ó斎?,讀者可以自行設定調節(jié)參數用于繪制符合自己要求的數據),本文則將參數寫到對應的參數文件中,再以參數文件的解析獲取對應的圖片輸出數據
alluvial_table=read.csv(inputfilename, sep="\t", header=T)
plot_args<-read.table(argfilename,sep="\t",header=F,row.names = 1)
plot_args<-as.data.frame(t(plot_args))
pic_height_num=as.numeric(as.vector(plot_args$pic_height_num)[1])
pic_width_num=as.numeric(as.vector(plot_args$pic_width_num)[1])
pic_res_num=as.numeric(as.vector(plot_args$pic_res_num)[1])
mar_1_size=as.numeric(as.vector(plot_args$mar_1_size)[1])
mar_2_size=as.numeric(as.vector(plot_args$mar_2_size)[1])
mar_3_size=as.numeric(as.vector(plot_args$mar_3_size)[1])
mar_4_size=as.numeric(as.vector(plot_args$mar_4_size)[1])
png(outputfilename, width = pic_width_num, height = pic_height_num, res = pic_res_num)
par(mar=c(mar_1_size,mar_2_size,mar_3_size,mar_4_size))
再次,通過相應的代碼完成圖片的繪制。這里的繪圖參數都是ggplot2的常見參數,讀者可以從官方文檔中得到詳細解答,筆者在這里就不進行贅述了。至于輸入文件的內容及其意義詳見本文開端中的‘劃重點’部分。
alluvial_plot=ggplot(alluvial_table,aes(x = survey, stratum = response, alluvium = subject,y = freq,fill = response, label = response))
alluvial_plot=alluvial_plot+scale_x_discrete(expand = c(.1, .1))
alluvial_plot=alluvial_plot+geom_flow()
alluvial_plot=alluvial_plot+geom_stratum(alpha = .5)
alluvial_plot=alluvial_plot+geom_text(stat = "stratum", size = 3)
alluvial_plot=alluvial_plot+theme(legend.position = "none")
alluvial_plot=alluvial_plot+theme_bw()
alluvial_plot=alluvial_plot+theme(panel.grid=element_blank())
alluvial_plot=alluvial_plot+theme(axis.text = element_blank())
alluvial_plot=alluvial_plot+theme(axis.ticks = element_blank())
alluvial_plot=alluvial_plot+theme(panel.border = element_blank())
alluvial_plot=alluvial_plot+ggtitle("vaccination survey responses at three points in time")
alluvial_plot
dev.off()
最后,一張完美的共線性圖隨即誕生(手動鼓掌)。

三 慣例小結
其實這一圖片繪制充分體現了可視化的理念吧,也就是所見即所得。雖說這一圖片的實現并不是特別困難,但是能夠想到使用這一形式表示圖片,已經是在可視化的方向上前進了一大步了。
另外,進一步推廣一下我開發(fā)的相關軟件,Multi-omics Hammer軟件和Multi-omics Visual軟件,也歡迎大家關注并多提意見。另外,因為輸入文件比較長,我這里就截取了一部分,詳細的話可以見個人介紹WX
以下為相關軟件地址:
Multi-omics Hammer軟件地址:https://github.com/wangjun258/Multi-omics-Hammer
Multi-omics Visual軟件地址:https://github.com/wangjun258/Multi_omics_Visual