前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【绘图】高维数据可视化必备图形-平行坐标图

【绘图】高维数据可视化必备图形-平行坐标图

作者头像
用户6317549
发布2020-06-29 11:29:15
1.5K0
发布2020-06-29 11:29:15
举报
文章被收录于专栏:科研猫
如果我们想比较某个数值在不同分组之间的变化差异。或者随着时间序列的变化趋势,往往会用到折线图。折线图是在我们的科研绘图当中最为常用的图形之一。

正如在这个图形中,可以清晰的看到,某些观察值随着组别的变化而产生的变化。不过,随着基因组大数据的不断发展和应用,在很多科研绘图场景中,高维数据的处理变得越来越重要。很多时候我们接触到的数据。不仅仅是几个样本和十几个测量值而已,往往是成百上千个基因或者检测结果。如此高维的数据,如果我们想要观察他们的变化趋势,应该使用何种图形呢?

在上面的这张图形中,仅仅有两条线。如果有几十条、几百条折线,或者多个分组呢?不知道大家有没有考虑过这样的问题。遇到如此的数据,想要绘制折线图,我们该如何来进行展示?

刚好近些天,有粉丝问我这样一个问题。他说他们随访了一个肿瘤病人很长的时间,获取了这个病人从发病前到确诊肿瘤、再到肿瘤进展、肿瘤转移等各个时期的基因组数据。他想要分析各个基因在不同时期的变化趋势,并从中选取影响肿瘤转归的重要因子。

对于这个问题,如果单纯为了比较不同分期基因表达的差异。我们可以用箱线图,或者小提琴图,但是这些图形体现的仅仅是不同分组之间的差异。同一个基因是如何随着时间变化而变化的,貌似只能够通过折线图来进行展示。但是话又说回来,如此多的基因,来绘制折线图使用常规的绘图方法能够实现吗?今天我们就来给大家介绍一种全新的图形,它可以说是折线图的进阶版,非常适合进行高维数据变化趋势的可视化,那就是平行坐标图

平行坐标图(parallel coordinate plot)是可视化高维多元数据的一种常用方法,为了显示多维空间中的一组对象,绘制由多条平行且等距分布的轴,并将多维空间中的对象表示为在平行轴上具有顶点的折线。顶点在每一个轴上的位置就对应了该对象在该维度上的中的变量数值,比如下面的这张图。

从图中我们可以看出,平行坐标图和折线图相比是非常相似的。不过,虽然平行折线图属于折线图的特殊类型,但是它和普通的折线图又具有明显的区别。因为平行折线图并不局限于描述某一种或者某几种趋势的变化关系。对于时间序列的不同时间节点、不同梯度的反应浓度等等数值,都可以使用平行坐标图来进行具体数值的描述。下面我们就跳过对图形背景的描述,进入到实际的绘图时间过程当中。

实例练习

首先我们来看一下绘图用的测试数据集。这个数据集当中分了4个肿瘤的阶段。总共有150个基因,150个基因当中,又按照通路分了三个组。这个就是我们的测试数据:

现在,我们要做的,就是比较这150个基因在4个分组中的变化趋势。那么下面我们就来进行图形的绘制。在这里我们用了GGally包中的ggparcoord()函数进行绘图。具体代码如下:

代码语言:javascript
复制
1ggparcoord(data,
2           columns = 1:4, groupColumn = 5,
3           showPoints = TRUE, 
4           title = "Parallel Coordinate Plot for cancer Data",
5           alphaLines = 0.3,
6           scale = "globalminmax") + 
7  scale_color_viridis(discrete=TRUE) +
8  theme_ipsum()+
9  theme(plot.title = element_text(size=10))

怎么样,这个图看上去很不错吧。在平行坐标轴中,它和普通折线图最大的一个区别就是它含有多条坐标轴。每一个坐标轴都代表了不同的维度,所以说坐标轴的排列方式和归一化的方式可能会影响观察者对数据的理解。因此在绘制平行坐标图的过程当中,坐标轴的顺序是极其重要的。在这里,我们的顺序是按照Grade1-4排列的,非常容易理解。关于坐标轴标准化的问题,由于每个分组之间的数据有高有低,坐标轴对应的数值也应该是不一致的。可是,如果把坐标轴的标度改变掉,那这个图看起来就会非常难以理解(比如即使是水平的曲线,也可能意味着数值的变化)。所以,我们在这里对于坐标轴的标度都是完全统一的。可是,有些数据相差太大或者太小,在图中如果用原始的数值进行绘制的话,图形有可能就完全重叠在一起了。

为了避免这个问题,我们对图形数值进行标化。ggparcoord()函数中标化的方法有很多,如果是“globalminmax”就是完全不变化,另外可以选用‘std’或者'robust', 'uniminmax', 'center', or 'centerObs'等多种标化方法,大家可以比较不同之处。

话说回来,平行坐标图也有它自己的缺点。那就是当数据非常庞大时,在图中的曲线就会显得非常密集,使得图形显得稍有杂乱,曲线难以辨认。那么如何解决这一问题呢?一种方法:当你的分组比较少的时候,可以通过facet分面的方法把不同分组分割开来即可。试试看:

此外,还有一种方法,我们经常做的一件事情,就是在图中把感兴趣的对象或者集合高亮出来。这样就容易辨别感兴趣的对象,同时淡化其他对象,达到消除背景曲线的目的。这样应该如何实现呢?其实也非常简单,就是把不同分组的color进行设置即可。比如这里,我把PI3K pathway组的基因设置成彩色,其他组设置成灰色。

好了,关于平行坐标图,我们就暂且讲到这里。不过还有一点要跟大家强调一下,平行坐标轴描述的大多是计量数据,对于定性数据或者分类变量,建议大家还是不要勉强使用平行坐标图。那么在这种情况下该用哪一种图形呢?对于分类变量和定性变量来说,我们有一种非常好看的图形,而且它和平行坐标图有着异曲同工之妙,那就是:桑基图(Sankey plot),它在分组数据中用的也是很多,这次我们就先买个关子,关于桑基图下次咱们再讲。

科研猫原创出品,任何形式转载,均需获授权

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科研猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档