一 导言
共线性图作为新近出现的一种数据可视化方式,以其直观、形象的方式受到大家的普遍欢迎,也在众多文章中获得了应用。该图的核心理念就是将不同时期间同一批数据的关系connect起来,即不同阶段中所有样品在众多分类间的流动情况(流动或许表述的不是那么准确,但的确是这样一种形式)。考虑到部分读者对这种图的需求,因此本推文将以代码加解说的方式展示如何进行这类图片的绘制(有没有很贴心)。
二 R包使用
首先,我们需要做的就是加载对应的R包
library(ggalluvial)
随后,设置命令行参数的意义。这里是为了方便后续直接调用,其中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)
对于输出图片而言,我们需要的是确定输出图片的长、宽、像素、边界的大小(当然,读者可以自行设定调节参数用于绘制符合自己要求的数据),本文则将参数写到对应的参数文件中,再以参数文件的解析获取对应的图片输出数据
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()
最后,一张完美的共线性图随即诞生(手动鼓掌)。
三 惯例小结
其实这一图片绘制充分体现了可视化的理念吧,也就是所见即所得。虽说这一图片的实现并不是特别困难,但是能够想到使用这一形式表示图片,已经是在可视化的方向上前进了一大步了。
另外,进一步推广一下我开发的相关软件,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