利用ggcor包绘制相关性组合图及环状热图

Science,2019

ggcor包最初是因为能快速实现19年Science一组合相关性图(上图所示)变得流行起来,除此该包对热图、热图等等的可视化都是很方便快捷的,除了之前介绍过的几种相关性图几种方式,此包也是个不错的选择,且具独特的风格(特别是组合相关性图、环形热图)。但是不知道因为何种原因此包在Github上消失了....,到作者(厚缊)个人博客上瞅了瞅发现关于包的参数介绍示例等也都没有了,在评论区里看到作者回答项目已不再提供任何代码和任何资料,需要的可以去国内的gitee和国外的github搜索看看有没有别人存的代码。幸运的是也发现已经有人将ggcor项目fork到自己的gitee了并提供了地址,所以我们可以根据此网址安装:

安装

 ## Gitee
devtools::install_git("https://gitee.com/dr_yingli/ggcor") 

library(ggcor)
# 版本号
> packageVersion('ggcor')
[1] ‘0.9.8.1’

注意: 发现Gitee上的这个包是 ‘0.9.8.1’ 版本 ,之前用过此包的同学也要留意下,因为版本变化好多函数可能已经不能用或者做了变更,待会儿你就会发现这个问题,所以同样的代码你可能重现不出图形,使用时要注意你版本。可能最早的用户用的都是[1] ‘0.9.5’版本的,刚好我旧版本的R中也有这个老版本R包,所以我这里分别演示下新旧版本ggcor的作图代码,自己比较异同做选择~~

## 之前的旧版本
> packageVersion('ggcor')
[1] ‘0.9.5’

## 自定义安装,根据自己library的路径进行修改。
install.packages("E:/R/R-4.0.2/library/ggcor.zip", repos = NULL, type = "source")

新版ggcor(0.9.8.1)

相关性图

quickcor(mtcars) + geom_square()
image-20201014080722487

我们?quickor可以看到作者提供的示例代码

library(ggplot2)
library(patchwork)
# layer of tile
A <- quickcor(mtcars) + geom_colour()

# layer of circle and trim the lower triangle
B <- quickcor(mtcars, type = "upper") + geom_circle2()

# layer of ellipse and not show diagonal
C <- quickcor(mtcars, type = "lower", show.diag = FALSE) + geom_ellipse2()

# layer of square and reorder correlation matrix by cluster
D <- quickcor(mtcars, cluster = TRUE) + geom_square()

# layer of confidence box
E <- quickcor(mtcars, cor.test = TRUE) + geom_confbox()

# different layer of upper/lower triangle
F <- quickcor(mtcars, cor.test = TRUE) +
  geom_square(data = get_data(type = "lower", show.diag = FALSE)) +
  geom_mark(data = get_data(type = "upper", show.diag = FALSE)) +
  geom_abline(slope = -1, intercept = 12)
(A+B+C)/(E+D+F)+ plot_annotation(tag_levels = 'A')

image-20201014082256929

组合相关性图(Mantel.test)

library(dplyr)
library(vegan)
library(ggplot2)
#> Warning: package 'dplyr' was built under R version 3.6.2
data("varechem", package = "vegan")
data("varespec", package = "vegan")

mantel <- mantel_test(varespec, varechem, mantel.fun = 'mantel.randtest',spec.dist.method = 'bray', env.dist.method = 'euclidean', 
                      spec.select = list(Spec01 = 1:7,
                                         Spec02 = 8:18,
                                         Spec03 = 19:37
                                                   )) %>% 
  mutate(r_value = cut(r, breaks = c(-Inf, 0.25, 0.5, Inf), 
                   labels = c('<0.25', '0.25-0.5', '>=0.5'), right = FALSE),
         p_value = cut(p.value, breaks = c(-Inf, 0.001, 0.01, 0.05, Inf), 
                       labels = c('<0.001', '0.001-0.01', '0.01-0.05', '>=0.05'), right = FALSE))

quickcor(varechem, type = "upper") +
  geom_square() +
  anno_link(aes(colour = p_value, size = r_value), data = mantel) +
  scale_size_manual(values = c(0.5, 1, 2)) +
  scale_colour_manual(values = c("#D95F02", "#1B9E77", "#A2A2A288")) +
  guides(size = guide_legend(title = "Mantel's r",
                             override.aes = list(colour = "grey35"), 
                             order = 2),
         colour = guide_legend(title = "Mantel's p", 
                               override.aes = list(size = 3), 
                               order = 1),
         fill = guide_colorbar(title = "Pearson's r", order = 3))
image-20201014083915893

环状热图

# 需要安装ambient包
install.packages('ambient') 
library(ambient)

rand_correlate(100, 8) %>% ## require ambient packages
  quickcor(circular = TRUE, cluster = TRUE, open = 45) +
  geom_colour(colour = "white", size = 0.125) +
  anno_row_tree() +
  anno_col_tree() +
  set_p_xaxis() +
  set_p_yaxis()
image-20201014100635681

旧版本ggcor(0.9.5)

相关性图

基本函数没有变化,不再过多讨论

quickcor(mtcars) + geom_square() 
image-20201014103810655

组合相关性图

这部分函数和0.9.8.1版本相比是变化最多的,如combination_layoutgeom_start_point等函数在新版本中都没有了,大家也可以自己动手实践下找找差别。

library(vegan) ## 获取数据
library(ggcor)
data("varespec")
data("varechem")
corr <- correlate(varechem, cor.test = TRUE) %>% 
  as_cor_tbl(type = "upper", show.diag = FALSE)
mantel2 <- mantel_test(varespec, varechem, mantel.fun = 'mantel.randtest',spec.dist.method = 'bray', env.dist.method = 'euclidean', 
                       spec.select = list(Spec01 = 1:7,
                                          Spec02 = 8:18,
                                          Spec03 = 19:24))%>%

     mutate(r = cut(r, breaks = c(-Inf, 0.25, 0.5, Inf), 
                          labels = c('<0.25', '0.25-0.5', '>=0.5'), right = FALSE),
                  p.value = cut(p.value, breaks = c(-Inf, 0.001, 0.01, 0.05, Inf), 
                                labels = c('<0.001', '0.001-0.01', '0.01-0.05', '>=0.05'), right = FALSE))


#对于重要的相关系数的取舍,除了选择了直接剔除或者不在图中展示。此外,也可以选择将它们保留在图中,使用其它颜色区分即可。
df <- combination_layout(mantel2, cor_tbl = corr) ## 这里需要存储下结果
quickcor(corr) + geom_square() + #还有更多样式,和 corrplot 包中的风格是一致的
  geom_link(aes(colour = p.value,size = r), data = df) + # 添加连接线
  geom_start_point(fill = "red", shape = 23, size = 4, data = df) + # 设置起始点颜色
  geom_end_point(fill = "blue", shape = 21, size = 4, data = df) + # 设置终点颜色
  geom_start_label(aes(x = x - 0.5), hjust = 1, size = 5, data = df) +
  #scale_fill_gradient2(midpoint = 0, low = 'blue', mid = 'white', high = 'red', space = 'Lab')+
  scale_fill_gradient2(midpoint = 0, low = "#56B4E9", mid = "white",high = "#E69F00", space = "Lab" )+
  #scale_color_gradient(low = 'red', high = 'blue') +
  scale_color_manual(values=c("#56B4E9", "#E69F00", "#999999"))+
  scale_size_manual(values = c(0.1, 0.5, 1))  +
  geom_end_label(aes(x = xend + 0.5), hjust = 0, size = 3.8, data = df) +
  expand_axis(x = c(-6, 14.5)) +
  remove_y_axis()
image-20201014103736762

对称环形热图

library(ggcor)

#计算相关系数
cor <- correlate(mtcars,method = 'spearman') %>% trans_polar()

# 绘制环形热图
correlate(mtcars) %>%
  polarcor() + geom_arc_colour(aes(fill = r))
image.png

非对称环形热图

基本图形
library(ggplot2)
data("varespec", package = "vegan")
data("varechem", package = "vegan")
correlate(varechem, varespec) %>%
  polarcor() +
  geom_arc_colour(aes(fill = r), size = 0.25) +
  coord_fixed(xlim = c(-1.2, 1.2), ylim = c(-1.2, 1.2))
image.png
避免标签的位置重叠
#  通过`set_arc_axis_x()`、`set_arc_axis_y()`函数来设置尺寸
correlate(varechem, varespec) %>%
  polarcor(no.axis = TRUE) +
  geom_arc_colour(aes(fill = r), size = 0.25) +
  set_arc_axis_x() +
  set_arc_axis_y(size = 2.8) +
  coord_fixed(xlim = c(-1.2, 1.2), ylim = c(-1.2, 1.2))
image.png
设置分组的情况
set.seed(20201014)
grp <- sample(LETTERS[1:3], 24, replace = TRUE)
grp
fortify_cor(varechem, varespec, group = grp) %>%
  polarcor(no.axis = TRUE, split.by.group = TRUE, group.space = 2) +
  geom_arc_colour(aes(fill = r), colour = "grey90", size = 0.1) +
  set_arc_axis_x(mapping = aes(colour = .group), size = 2.8) +
  set_arc_axis_y(size = 2.8) +
  coord_fixed(xlim = c(-1.2, 1.2), ylim = c(-1.2, 1.2))
image-20201014093219907
对于相关系数显著性p<0.05的加上标签
correlate(varechem, varespec, cor.test = TRUE) %>%
  polarcor(no.axis = TRUE) +
  geom_arc_colour(aes(fill = r), size = 0.25) +
  geom_point(mapping = aes(x, y), shape = 17,
             data = function(data) filter(data, p.value < 0.05)) +
  set_arc_axis_x() +
  set_arc_axis_y(size = 2.8) +
  scale_fill_gradient2n(colours = c("#E9A3C9", "#F7F7F7", "#A1D76A")) +
  coord_fixed(xlim = c(-1.2, 1.2), ylim = c(-1.2, 1.2))
image-20201014093423052
添加相关性系数及显著性符号
correlate(mtcars, cor.test = TRUE) %>%
  polarcor(cluster = TRUE) +
  geom_arc_colour(aes(fill = r), size = 0.25) +
  geom_mark(aes(x, y, r = r, p.value = p.value, angle = angle), 
            size = 3) +
  scale_fill_gradient2n(colours = c("#E9A3C9", "#F7F7F7", "#A1D76A")) +
  coord_fixed(xlim = c(-1.05, 1.05), ylim = c(-1.05, 1.05))
image-20201014093606329

相比之下,我更喜欢旧版本ggcor一些,因为它的函数名称会更容易理解一点,而且可实现的风格会稍多一些,不过用旧版本的较多,也可能新版本的函数我还了解不够,大家还是根据个人喜好安装对应的版本,建议如果电脑上装有多个版本的R的话,也可以将新旧版本的ggcor分别装在不同版本的R library中,更便于管理~~ 公众号【BioparaMeta】 后台回复【ggcor】可获取旧版本的R包,然后放在library路径下自定义安装就好了!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容