厚缊

诹图——ggcor简介(三)

厚缊 / 2020-02-02


写了两篇数据预处理,再不来点图可能会急死人,哈哈哈。这篇文章主要介绍如何绘制相关系数矩阵热图,并能根据需求灵活地选择合适的函数来修改细节。

quickcor()函数介绍

和最早的版本相比,这一块变化十分明显:一方面快速出图的函数由ggcor()变成了quickcor(),另一方面新版本的ggcor()函数是精简版,主要目的是增加灵活性,让用户能根据需求自我定制。不要害怕变化,基本没啥大的影响。

quickcor()函数说白了就是能快速地进行相关系数矩阵可视化的函数,这个函数内部做了很多额外的工作来保证出图简单。

library(ggcor)
args(quickcor)
## function (x, y = NULL, mapping = NULL, grid.colour = "grey50", 
##     grid.size = 0.25, axis.x.position = "auto", axis.y.position = "auto", 
##     axis.label.drop = TRUE, legend.position = "auto", ...) 
## NULL

需要说明下quickcor()的运行机制,对于xy...参数均传递给fortify_cor()函数,处理成cor_tbl对象,再把cor_tbl对象作为ggplot()函数的data参数。这里需要注意两个事情:第一,quickcor()(包括下一期要讲的ggcor()函数)都是使用cor_tbl中的.col.id.row.id分别作为x和y轴坐标,所以这两个函数的坐标是连续的;第二,正是因为使用的是连续坐标,导致在初始化的时候要加入scale_x/y_continuous()来处理坐标轴标签。这里埋一个伏笔,我一直在计划构建一个新的S3向量(类似于日期型)来处理这个问题,可能在某一个版本就改变了。

quickcor(mtcars)

quickcor(mtcars, type = "lower")

quickcor(mtcars[1:6], mtcars)

基本可视化例子

这里没太多其他的技巧,主要介绍下ggcor中有的一些图层函数及其组合用法。

quickcor(mtcars) + geom_colour() ## 本质上就是geom_tile

quickcor(mtcars) + geom_square()

quickcor(mtcars) + geom_circle2()

quickcor(mtcars) + geom_ellipse2()

quickcor(mtcars) + geom_pie2() ## geom_ring()的特殊情况

quickcor(mtcars) + geom_ring()

quickcor(mtcars) + geom_star()

quickcor(mtcars) + 
  geom_number(aes(num = r)) ## geom_text()的改进版,主要用来添加数值型文本

quickcor(mtcars, cor.test = TRUE) + 
  geom_mark() ## geom_text()的改进版,主要用来添加相关系数及显著性

quickcor(mtcars, cor.test = TRUE) + geom_colour() +
  geom_cross() ## 主要用来标记非显著的

聚类

只支持对称相关系数矩阵聚类。

quickcor(mtcars, cluster = TRUE) + 
  geom_square()

上下三角

对于上下三角的处理主要通过typeshow.diag参数来控制:

quickcor(mtcars, type = "lower") +
  geom_square()

quickcor(mtcars, type = "upper") +
  geom_square()

quickcor(mtcars, type = "lower", show.diag = TRUE) +
  geom_square()

改变默认填充颜色

ggcor就是基于ggplot2的,因此改变默认颜色也就是自主设置颜色映射函数。

library(ggplot2)
quickcor(mtcars) +
  geom_square() +
  scale_fill_gradientn(colours = c("red", "white", "blue"))

quickcor(mtcars) +
  geom_square() +
  scale_fill_viridis_c()

非对称的相关系数矩阵

非对称指的是相关系数矩阵不对称,也就是两个表做的交叉相关性检验的情况,这时不支持取上下三角,也不支持聚类。

library(vegan)
data("varechem")
data("varespec")
quickcor(varespec, varechem) +
  geom_square()

上下三角不一样

上下三角标记不同的内容的图本质上是对于上下三角分别绘制,结合ggcorget_data()函数可以很方便的处理这种情况。

quickcor(mtcars, cor.test = TRUE) +
  geom_square(data = get_data(type = "lower")) +
  geom_mark(data = get_data(type = "upper")) +
  add_diag_label(size = 5, colour = "red") +
  remove_axis()

可以看一个更复杂的例子。

quickcor(mtcars, cor.test = TRUE) +
  geom_square(data = get_data(p.value < 0.05, type = "lower")) +
  geom_circle2(data = get_data(p.value < 0.05, type = "upper"), 
               r0 = 0.45, fill = "lightblue") +
  geom_mark(data = get_data(p.value < 0.05, type = "upper")) +
  geom_cross() +
  add_diag_label(size = 5, colour = "red") +
  remove_axis()

小结

quickcor()足够强大,能处理90%以上的相关系数矩阵热图的情况,剩余的10%后续介绍。

下期预告:ggcor()函数。