节选自http://houyun.xyz/post/2019/10/26/ggcor/
安装绘图R包(还处在开发阶段)
1 2 3 4 | if(!require(devtools)) install.packages("devtools") if(!require(ggcor)) devtools::install_github("houyunhuang/ggcor", force = TRUE) |
绘制基本图,如同corrplot包一样方便
1 | library(ggcor) |
1 | ## Loading required package: ggplot2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ## ggcor可以调整的参数比较多,并且处于开发阶段,主要的参数是以下几个: ## 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", ## cluster.absolute = FALSE, ## keep.name = FALSE, ## ...) ## ggcor提供了定制的geom_square()、geom_circle2()、geom_ellipse2()、geom_pie2()、geom_colour()、geom_confbox()、geom_num()、geom_mark()、geom_cross()9个ggplot2图层函数,可以根据需要进行叠加。除了ggplot2中一般化的参数(x、y、fill、colour、size等)最常用参数r、p、low、upp、num、r0、sig.thres、sig.level、mark等。 ggcor(mtcars) + geom_square() |
image.png
1 | ggcor(mtcars, type = "upper") + geom_circle2() |
image.png
1 | ggcor(mtcars, type = "lower", show.diag = TRUE) + geom_ellipse2() |
image.png
1 | ggcor(mtcars, type = "full", cluster.type = "all") + geom_pie2() |
1 2 3 | ## Registered S3 method overwritten by 'gclus': ## method from ## reorder.hclust vegan |
1 2 3 | ## Registered S3 method overwritten by 'dendextend': ## method from ## rev.hclust vegan |
1 2 3 | ## Registered S3 method overwritten by 'seriation': ## method from ## reorder.hclust gclus |
image.png
1 2 3 | ggcor(mtcars, cluster.type = "all") + geom_colour() + geom_num(aes(num = r), colour = "grey90", size = 3.5)#可以标记相关系数的图层 |
image.png
1 | ggcor(mtcars, type = "full", cor.test = TRUE) + geom_confbox() |
image.png
1 2 3 | ggcor(mtcars, type = "full", cor.test = TRUE, cluster.type = "all") + geom_colour() + geom_cross() |
image.png
1 2 3 | ggcor(mtcars, type = "full", cor.test = TRUE, cluster.type = "all") + geom_raster() + geom_mark(sig.thres = 0.05, size = 3, colour = "grey90")#过滤掉不显著的值 |
image.png
1 2 3 | ggcor(mtcars, type = "full", cor.test = TRUE, cluster.type = "all") + geom_raster() + geom_mark(r = NA, sig.thres = 0.05, size = 5, colour = "grey90")#不标记系数,只标记显著符号 |
image.png
1 2 3 | ggcor(mtcars, type = "full", cor.test = TRUE, cluster.type = "all") + geom_raster() + geom_mark(r = NA, sig.level = 0.05, mark = "*", vjust = 0.65, size = 6, colour = "grey90") |
image.png
绘制非对称相关系数图,这个功能非常独有
1 | library(vegan) # 使用vegan包所带的数据集 |
1 | ## Loading required package: permute |
1 | ## Loading required package: lattice |
1 | ## This is vegan 2.5-6 |
1 2 3 4 | data(varechem) data(varespec) df03 <- fortify_cor(x = varechem, y = varespec[ , 1:30], cluster.type = "col")#调用fortify_cor()函数来处理数据 ggcor(df03) + geom_colour() |
image.png
1 2 | df04 <- fortify_cor(x = varespec[ , 1:30], y = varechem, cor.test = TRUE) ggcor(df04) + geom_square() + geom_cross(size = 0.2) |
image.png
绘制上下三角不一样相关系数图
1 2 | df05 <- fortify_cor(x = varechem, cor.test = TRUE, cluster.type = "all") ggcor(df05) + geom_circle2() |
image.png
1 2 | df05_lower <- get_lower_data(df05, show.diag = FALSE) ggcor(df05_lower) + geom_circle2() |
image.png
1 2 3 | ggcor(df05) + geom_pie2(data = get_data(type = "upper", show.diag = FALSE)) + geom_ellipse2(data = get_data(type = "lower", show.diag = TRUE)) |
image.png
1 2 3 4 5 6 7 8 9 | ggcor(df05) + geom_segment(aes(x = x - 0.5, y = y + 0.5, xend = x + 0.5, yend = y - 0.5), data = get_data(type = "diag"), size = 0.5, colour = "grey60") + geom_colour(data = get_data(type = "upper", show.diag = FALSE)) + geom_mark(data = get_data(type = "upper", show.diag = FALSE), size = 3) + geom_circle2(data = get_data(r >= 0.5, type = "lower", show.diag = FALSE), r = 0.8, fill = "#66C2A5") + geom_num(aes(num = r), data = get_data(type = "lower", show.diag = FALSE), size = 3) |
image.png
列名放在对角线
1 2 3 4 | ggcor(mtcars, cor.test = TRUE, cluster.type = "all") + geom_confbox(data = get_data(type = "upper", show.diag = FALSE)) + geom_num(aes(num = r), data = get_data(type = "lower", show.diag = FALSE), size = 3.5) + add_diaglab(size = 4.56) + remove_axis() |
image.png
mantel 检验组合图,这个是最酷的功能
ggcor提供了mantel检验的封装函数fortify_mantel(),支持vegan包中的mantel()、mantel.partial()和ade4包中的mantel.randtest()、mantel.rtest()函数,差别上说mantel.partial()是偏mantel检验(有控制变量),其它三个是mantel检验.
1 2 3 4 5 6 | mantel <- fortify_mantel(varespec, varechem, spec.select = list(spec01 = 22:25, spec02 = 1:4, spec03 = 38:43, spec04 = 15:20)) df06 <- as_cor_tbl(mantel)#转换成ggcor可用的数据格式 ggcor(df06) + geom_pie2() + geom_cross() |
image.png
1 2 3 4 5 6 7 8 9 10 11 12 | corr <- fortify_cor(varechem, type = "upper", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") mantel <- fortify_mantel(varespec, varechem, spec.select = list(spec01 = 22:25, spec02 = 1:4, spec03 = 38:43, spec04 = 15:20), mantel.fun = "mantel.randtest") ggcor(corr, xlim = c(-5, 14.5)) + add_link(mantel, diag.label = TRUE) + add_diaglab(angle = 45) + geom_square() + remove_axis("y") |
image.png
1 2 3 4 5 6 | corr <- fortify_cor(varechem, type = "upper", show.diag = FALSE, cor.test = TRUE, cluster.type = "all") ggcor(corr, xlim = c(-5, 14.5)) + add_link(mantel, diag.label = TRUE) + add_diaglab(angle = 45) + geom_pie2() + remove_axis("y") |
image.png
1 2 3 4 5 6 | corr <- fortify_cor(varechem, type = "lower", show.diag = FALSE, cor.test = TRUE, cluster.type = "all") ggcor(corr, xlim = c(0.5, 20)) + add_link(mantel, diag.label = TRUE) + add_diaglab(angle = 45) + geom_ellipse2() + remove_axis("y") |
image.png
1 2 3 4 5 6 7 8 9 10 11 12 13 | corr <- fortify_cor(varechem, varechem[ , 1:7], type = "full", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") mantel <- fortify_mantel(varespec, varechem, spec.select = list(spec01 = 22:25, spec02 = 1:4, spec03 = 38:43, spec04 = 15:20), mantel.fun = "mantel.randtest", nrepet = 2000) extra.params <- extra_params(group.label = text_params(size = 6), link.params = link_params(group.point.hjust = 2)) ggcor(corr, axis.y.position = "left", legend.position = "left", xlim = c(0.5, 14.5)) + add_link(mantel, extra.params = extra.params) + geom_circle2() |
image.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | group <- rep(LETTERS[1:3], 8) corr <- fortify_cor(varechem, type = "upper", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") mantel <- fortify_mantel(varespec[ , 38:43], varechem, spec.group = group, env.group = group, is.pair = TRUE, mantel.fun = "mantel.randtest") ggcor(corr, xlim = c(-5, 14.5)) + add_link(mantel, diag.label = TRUE) + add_diaglab(angle = 45) + geom_colour() + geom_shade(sign = -1) + remove_axis("y") |
image.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | corr <- fortify_cor(varechem, type = "upper", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") mantel <- fortify_mantel(varespec, varechem, spec.select = list(spec01 = 22:25, spec02 = 1:4, spec03 = 38:43, spec04 = 15:20), mantel.fun = "mantel.randtest") mantel <- dplyr::filter(mantel, p <= 0.05) ggcor(corr, xlim = c(-5, 14.5)) + add_link(mantel, diag.label = TRUE, legend.drop = TRUE) + add_diaglab(angle = 45) + geom_square() + remove_axis("y") |
image.png
1 2 3 4 | corr <- fortify_cor(varechem, type = "upper", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") corr01 <- fortify_cor(varechem, varespec[ , 38:39], type = "upper", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") |
1 | ## Warning: 'type=upper' just supports for symmetric correlation matrix. |
1 2 3 4 5 6 7 8 9 10 11 12 | mantel <- fortify_mantel(varespec, varechem, spec.select = list(spec01 = 22:25, spec02 = 1:4, spec03 = 38:43, spec04 = 15:20), mantel.fun = "mantel.randtest") ggcor(corr, xlim = c(-5, 14.5)) + add_link(x = corr01, diag.label = TRUE, link.line.colours = c("#E31A1C", "#33A02C")) + add_diaglab(angle = 45) + geom_square() + remove_axis("y") |
image.png
1 2 3 4 5 6 7 8 | ggcor(corr, xlim = c(-5, 14.5)) + add_link(x = corr01, mapping = aes(size = abs(r)), diag.label = TRUE) + add_diaglab(angle = 45) + geom_square() + scale_size_continuous(limits = c(0, 1), range = c(0.25, 3)) + guides(size = guide_legend(title = "abs r", override.aes = list(colour = "grey35"), order = 1)) + remove_axis("y") |
image.png
1 2 3 4 5 6 7 8 9 10 | corr <- fortify_cor(varechem, type = "upper", show.diag = TRUE, cor.test = TRUE, cluster.type = "all") df <- data.frame(x = rep(LETTERS[1:3], 14), y = rep(cor_tbl_yname(corr), 3), r = runif(42, -1, 1), p = runif(42, 0, 0.5), stringsAsFactors = FALSE) ggcor(corr, xlim = c(-5, 14.5)) + add_link(df, diag.label = TRUE, colour = "red") + add_diaglab(angle = 45) + geom_square() + remove_axis("y") |
image.png