厚缊 业余的R语言可视化重度患者
个人博客:houyun.xyz
邮箱:houyunhuang@163.com
转载本文(包括长期转载账号)必须联系厚缊授权
相关系数矩阵可视化已经至少有两个版本的实现了,魏太云基于base绘图系统写了
corrplot
包,应该说是相关这个小领域中最精美的包了,使用简单,样式丰富,只能用惊艳来形容。 Kassambara的
ggcorrplot
基于
ggplot2
重写了
corrplot
,实现了
corrplot
中绝大多数的功能,但仅支持“square”和“circle”的绘图标记,样式有些单调,不过整个
ggcorrplot
包的代码大概300行,想学习用
ggplot2
来自定义绘图函数 ,看这个包的源代码很不错。还有部分功能相似的
corrr
包(在写
ggcor
之前完全没有看过这个包,写完之后发现在相关系数矩阵变data.frame方面惊人的相似),这个包主要在数据相关系数提取、转换上做了很多的工作,在可视化上稍显不足。
ggcor
的核心是为相关性分析、数据提取、转换、可视化提供一整套解决方案,目前的功能大概完成了70%,后续会根据实际需要继续扩展。 这里要介绍的
ggcor
是
corrplot
的有一种实现,在吸收借鉴(或者说是全般)
corrplot
的基础上,略有提升,使用上会更灵活简单。这里不得不说下整个开发过程,一方面是为了感谢来自五湖四海的朋友提的许许多多的专业意见,另一方面是深感歉意,由于我考虑不周,
ggcor
(第一次上传github测试大约在十天前,名字还是
ggcorrr
)存在各种各样的小bug,也有很多限制,这次为了升级和简化,不仅名字变了,里面的函数也变得完全不一样,若你们以前写了
ggcorrr
的代码,现在基本不可以重用了。 尽管这一版本的更新我考虑了很多应用场景,综合了方方面面的意见,但是bug和限制还是在所难免,希望朋友们继续提意见,提需求。当然,这一次有两点是可以保证的:一是包名不会变了,再变都成精了;二是包内的主体函数和参数不会变了,而且即使要变,我也会考虑兼容性。
安装
目前是测试版本,帮助文档还没写,得慢慢磨。
if(!require(devtools))
install.packages("devtools")
if(!require(ggcor))
devtools::install_github("houyunhuang/ggcor")
数据预处理函数
ggplot2
要求的数据格式是
data.frame
,要把相关系数矩阵处理成理想的数据格式需要一系列的操作。
ggcor
提供了两个主要的函数,一个是
as_cor_tbl()
函数,另一个是
fortify_cor()
函数,两者结合应该能满足绝大多数的应用场景需求。
as_cor_tbl()
是更底层的函数,
fortify_cor()
本质上调用了
as_cor_tbl()
来得到最终的数据结果。这个函数适用于已经知道,或者需要用其它更特殊的函数(非
stats::cor()
)来处理得到系数的情况,常用的参数是前三个。
x
—— 相关系数矩阵(或者数据框),矩阵行名和列名是必要的,若没有或者缺失值会自动补全名字,行名以“Y”开头,附上递增的整数序列,列名以“X”开头,附上附上递增的整数序列。
type
—— 相关系数矩阵图样式,“upper”截断下三角,“lower”截断上三角。
show.diag
—— 相关系数矩阵图中是否包含对角线,仅对对称矩阵有效。
p
—— 相关系数检验p值矩阵(或者数据框),必须与x
一一对应。
low
—— 相关系数置信区间下界矩阵(或者数据框),必须与x
一一对应。
upp
—— 相关系数置信区间上界矩阵(或者数据框),必须与x
一一对应。
cluster.type
—— 是否对相关系数矩阵进行重新排序,“none”表示不重排,“all”表示行列均重排,“row”表示对行重排,“col”则只对列重排。
...
—— 其它传递给matrix_order()
函数的参数。
library(ggcor)
## function(x,
## type = c("full", "upper", "lower"),
## show.diag = TRUE,
## p = NULL,
## low = NULL,
## upp = NULL,
## cluster.type = c("none", "all", "row", "col"),
## ...)
corr df df ## return a tibble
## # A tibble: 121 x 3
## x y r
## *
## 1 1 11 1
## 2 1 10 -0.852
## 3 1 9 -0.848
## 4 1 8 -0.776
## 5 1 7 0.681
## # … with 116 more rows
## Extra attributes:
## xname: mpg cyl disp hp drat wt qsec vs am gear carb
## yname: carb gear am vs qsec wt drat hp disp cyl mpg
## show.diag: TRUE
fortify_cor()
主要适用于处理原始数据表,即调用
cor()
求相关系数,
cor
函数对数据按列进行两两相关性计算,默认使用
pearson
方法,当然理论解读中提前的
spearman
和
kendall
方法也都支持。调用(若需要)
cor.test()
函数进行统计检验,并返回
ggcor
需要的数据类。
x
—— 原数据矩阵(或者数据框),列名是必要的,若没有或者缺失值会自动补全名字,列名以“X”开头,附上附上递增的整数序列。
y
—— 原数据矩阵(或者数据框),列名是必要的,若没有或者缺失值会自动补全名字,列名以“X”开头,附上附上递增的整数序列。当y
不为空(NULL)时,相关系数是x
中的每一列和y
中的每一列的相关性。
type
—— 相关系数矩阵图样式,“upper”截断下三角,“lower”截断上三角。
show.diag
—— 相关系数矩阵图中是否包含对角线,仅对对称矩阵有效。
cor.test
—— 逻辑值,是否进行相关性检验。
cor.test.alt
—— 相关性检验备择假设,详细请查看cor.test()
帮助。
cor.test.method
—— 相关性检验方法,详细请查看cor.test()
帮助。
cluster.type
—— 是否对相关系数矩阵进行重新排序,“none”表示不重排,“all”表示行列均重排,“row”表示对行重排,“col”则只对列重排。
cluster.method
—— 当cluster.order
为“HC”(默认)时算法,详细请查看ggcor::matrix_order()
。
...
—— 其它传递给cor()
函数的参数。
## function(
## x,
## y = NULL,
## type = c("full", "upper", "lower"),
## show.diag = FALSE,
## cor.test = FALSE,
## cor.test.alt = "two.sided",
## cor.test.method = "pearson",
## cluster.type = c("none", "all", "row", "col"),
## cluster.method = "HC",
## ... )
df01 TRUE, cluster.type = "all")
df01
## # A tibble: 121 x 6
## x y r p low upp
## *
## 1 1 11 1 7.44e-232 1.000 1.000
## 2 1 10 0.750 7.83e- 7 0.543 0.871
## 3 1 9 0.428 1.46e- 2 0.0927 0.676
## 4 1 8 0.527 1.94e- 3 0.218 0.740
## 5 1 7 0.395 2.53e- 2 0.0537 0.654
## # … with 116 more rows
## Extra attributes:
## xname: carb hp wt cyl disp drat am gear qsec mpg vs
## yname: vs mpg qsec gear am drat disp cyl wt hp carb
## show.diag: TRUE
as_cor_tbl()
和
fortify_cor()
返回值均是
cor_tbl
类的数据框(准确的说是
tibble
),并包含其它额外特殊属性,要充分利用
ggcor
包中一系列工具函数带来的便捷性,必须调用(手动比较麻烦)这两个函数预处理数据。
初始化绘图函数
ggcor
封装了一个基本的初始化函数
ggcor()
,用来处理数据、绘图类型、背景、坐标轴、颜色映射、图例等。看上去
ggcor()
函数非常复杂,但若仔细观察参数命名规则和分类,又是非常简单的。绘图区网格线参数名字均以
grid.*
开头;坐标轴相关参数均以
axis.*
开头;图例相关(主要是colourbar)的参数均以
legend.*
开头;还有
panel.backgroud
、
xlim
、
ylim
均是常见的参数,
panel.backgroud
参数用来设置绘图区背景颜色,
xlim
、
ylim
则是设置x/y轴的范围。把这几大块参数去掉后,剩下的参数只有6个了,瞬间清爽了不少。 要完全理解
ggcor()
的作用原理及相关参数的设置,需要先讲讲
ggcor()
内部构成。
ggcor()
本质上是调用了ggplot()
来初始化,
然后根据相关系数图的样式添加了一些辅助的图层。
x
、y
、mapping
、is.cor
、show.diag
和...
参数均和数据预处理和映射相关。
x
可以是cor_tbl
、矩阵(数据框)。当为cor_tbl
时直接作为data
参数传递给ggplot()
;为矩阵(数据框)时,若是(is.cor = TRUE
)相关系数矩阵(数据框)时,调用as_cor_tbl()
函数处理成cor_tbl
,若不是(is.cor = FALSE
)相关系数矩阵(数据框)时,调用fortify_cor()
函数处理成cor_tbl
,此时x
、y
、show.diag
和...
均传递给as_cor_tbl()
或者fortify_cor()
。
mapping
对应ggplot()
中的mapping
参数,当为空(默认)时,根据cor_tbl
中的变量情况添加,基础形式是aes(x = x, y = y, r = r, fill = r)
。若cor_tbl
包含“p”(进行了相关系数显著性检验),则最基础形式基础上额外添加p = p
,若检验方法(cor.test.method = "pearson"
),再加上low = low
和upp = upp