专栏首页小白鱼的生统笔记R语言绘制平行坐标图(PCP)示例

R语言绘制平行坐标图(PCP)示例

R语言绘制平行坐标图(PCP)示例

前文在讲述冲击图(alluvial diagram)时提到了,它在某种形式上是平行坐标图(parallel coordinate plot,PCP)的一种变体,那么本篇顺便提一下什么是平行坐标图。

平行坐标图是可视化高维几何和分析多元数据的常用方法。为了显示n维空间中的一组对象,绘制了由n条平行且等距分布的轴,并将n维空间中的对象表示为在平行轴上具有顶点的折线,顶点在第i轴上的位置对应于该对象的第i维变量数值。

尽管是折线图类型,但和普通的折线图是有区别的,平行坐标图不局限于描述单一趋势关系(如时间序列的不同时间点、反应底物的不同浓度梯度等),可以为不同类型变量的数值描述。

然而平行坐标图的缺点在于,在数据非常密集时它们可能过于杂乱,导致难以辨认。解决此问题的通常做法是在图中突出显示感兴趣的对象或集合,同时淡化所有其它对象,这样就可以在滤除噪声的同时描述重要的部分。

并且,平行坐标图中,轴的排列顺序可能会影响对数据的理解方式,归因于相邻变量之间的关系比非相邻变量更容易理解。因此,对轴进行重新排序可以帮助发现变量之间的潜在模式或相关性。

此外,平行坐标图描述的大多数是数值变量的关系,而对于定性或分类变量比较勉强。相比之下,冲击图(alluvial diagram)提供了对定性或分类变量关系的更好可视化方案。

考虑到实际应用中,平行坐标图的出现频率并不高,因此本篇不对该图作过多的阐述。主要是通过3个R包,MASS、plotly和GGally,大致展示一下平行坐标图的基本绘制方法,以对这种统计图有个初步认识。

示例数据集

iris数据集,记录了150朵鸢尾花的花朵性状测量值。

#数据集,详情 ?iris
data(iris)
head(iris)

这些鸢尾花来自三种物种,分别为setosa(n=50)、versicolor(n=50)和virginica(n=50)。

包含四种性状,分别为萼片长度(sepal length,cm)、萼片宽度(sepal width,cm)、花瓣长度(petal length,cm)和花瓣宽度(petal width,cm)。

接下来通过平行坐标图,描绘出三种鸢尾花的四种性状特征,在整体水平初步观测下它们之间的属性区别。

MASS包的平行坐标图

首先是MASS包,函数parcoord()可用于绘制平行坐标图,风格简洁朴素。

library(MASS)
 
#赋值组别(鸢尾花物种)颜色
iris[which(iris$Species == 'setosa'),'color'] <- '#440154'
iris[which(iris$Species == 'versicolor'),'color'] <- '#36B677'
iris[which(iris$Species == 'virginica'),'color'] <- '#FCE628'
 
#绘制平行坐标图,详情 ?parcoord
parcoord(iris[1:4], col = iris$color, var.label = TRUE)

在图中初步观察后,可以明显看到三种鸢尾花在四种性状特征的组成上是明显不同的。

GGally包的平行坐标图

GGally包是ggplot2的拓展包,延续了ggplot2的语法,因此对于熟悉ggplot2的同学们来说,使用GGally包的可视化调整将会非常容易上手。

library(GGally)
 
#一个简单示例,后面的函数(颜色、主题、坐标轴调整等)和 ggplot2 的用法是一致的
#详情 ?ggparcoord
ggparcoord(iris, columns = 1:4, groupColumn = 5,
    scale = 'uniminmax',
    showPoints = TRUE, alphaLines = 0.3) +
scale_color_manual(values = c('#440154', '#36B677', '#FCE628')) +
theme_bw()+
theme(plot.title = element_text(size = 13)) +
labs(x = '')

同样地,在图中初步观察后,可以明显看到三种鸢尾花在四种性状特征的组成上是明显不同的。

此外,通过函数ggparcoord()作图时,提供了多种对变量的标准化方法,由此可以获得不同的表现风格,对于探索变量间潜在结构很有帮助。大家有兴趣可以通过在ggparcoord()中添加参数“scale=”测试下。

plotly包的平行坐标图

plotly包提供了交互式风格,如果期望从图中查看感兴趣的一组变量,。

library(plotly)
 
#以数值指代分组 id
iris[which(iris$Species == 'setosa'),'species_id'] <- 1
iris[which(iris$Species == 'versicolor'),'species_id'] <- 2
iris[which(iris$Species == 'virginica'),'species_id'] <- 3
 
#绘制平行坐标图,详情 ?plot_ly
p <- plot_ly(iris,
    type = 'parcoords',
    line = list(color = ~species_id,
        colorscale = list(c(1, '#440154'), c(2, '#36B677'), c(3, '#FCE628'))),
    dimensions = list(
      list(range = range(iris$Sepal.Length), label = 'Sepal Length', values = ~Sepal.Length),
      list(range = range(iris$Sepal.Width), label = 'Sepal Width', values = ~Sepal.Width),
      list(range = range(iris$Petal.Length), label = 'Petal Length', values = ~Petal.Length),
          list(range = range(iris$Petal.Width), label = 'Petal Width', values = ~Petal.Width))
)
 
p

同样地,在图中初步观察后,可以明显看到三种鸢尾花在四种性状特征的组成上是明显不同的。

plotly包的交互风格对于我们探索变量间潜在结构,以及识别重要的对象或者变量集合等很有帮助。

本文分享自微信公众号 - 小白鱼的生统笔记(gh_5f751e893315),作者:生信小白鱼 鲤小白

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 几种常见的判别分析分类方法在R中实现

    判别分析(Discriminant analysis)用于基于一个或多个预测变量来预测对象属于某个给定类的概率,它对于连续或分类预测变量均适用。与logisti...

    用户7585161
  • R语言绘制分组柱状图示例

    简介了堆叠柱状图,顺便再简介一下分组柱状图在R中的绘制。鉴于ggplot2更易于操作,所以本篇主要阐述ggplot2的方法。已知ggplot2柱状图三种样式:g...

    用户7585161
  • STRING数据库构建蛋白质相互作用(PPI)网络

    STRING(https://string-db.org/)数据库,是用于预测蛋白质-蛋白质相互作用的数据库。它收集了许多物种的蛋白质相互作用信息,既包括试验验...

    用户7585161
  • Spring、Spring Boot和TestNG测试指南 - @TestPropertySource

    @TestPropertySource可以用来覆盖掉来自于系统环境变量、Java系统属性、@PropertySource的属性。

    颇忒脱
  • OCP-052考试题库汇总(45)-CUUG内部解答版

    You want to access employee details contained in flat files created by an applic...

    用户5892232
  • 在iOS中如何正确的实现行间距与行高

    最近准备给 VirtualView-iOS 的文本元素新增一个 lineHeight 属性,以便和 VirtualView-Android 配合时能更精确的保...

    用户1219438
  • 临近五一,小林我删删删删库了,要跑路吗?

    写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到到实体服务器跑。

    小林coding
  • Unity3D for SMSSDK Android短信验证开发文档

    SMSSDK的Unity3D插件主要为用户提供了两种集成的方式:一种是通过桥接文件直接调用SMSSDK的原生API,另外一种是使用SMSSDK...

    bering
  • 面试时,怎么介绍自己做过的项目?

    需求或机会--投资人在线上购买理财产品(平台代发布) 给借款人提供一个借款的渠道, 海尔(平台方)作为做一个监督方,从中抽取佣金; 第三方提供理财产品、保险、...

    张树臣
  • RxJava2操作符之“Take”

    最近我也在学习RxJava2,在网上找了好多文章来读,发现大多数都是说RxJava2和RxJava之间到底有什么区别的,每一个例子都要考虑RxJava里是怎么写...

    坑吭吭

扫码关注云+社区

领取腾讯云代金券