如何用ggcorrplot按分类变量region绘制多个相关矩阵?
按分类变量分面绘制多个相关矩阵(ggcorrplot实现)
我懂你想实现的效果——按region这个分类变量,生成对应每个组的相关矩阵图,就像facet_wrap那样分面展示,但ggcorrplot本身没有原生的分面支持,直接硬套facet肯定会报错,咱们换个思路,用分组生成单图+拼图的方式就能搞定,下面给你两种实用的方案:
方法1:用dplyr+purrr+patchwork(推荐,代码简洁现代)
这个组合能高效批量生成子图,再用patchwork轻松拼接成分面样式:
# 先加载需要的包 library(ggcorrplot) library(dplyr) library(purrr) library(patchwork) # 按region拆分数据,批量生成每个组的相关矩阵图 plot_list <- data %>% group_split(region) %>% # 把数据拆成按region分组的列表 map(function(sub_data) { # 计算当前组的相关矩阵 corr_matrix <- round(cor(sub_data[,18:24], use = "complete.obs"), 2) # 生成带标题的ggcorrplot ggcorrplot(corr_matrix) + ggtitle(paste("区域:", unique(sub_data$region))) + theme(plot.title = element_text(hjust = 0.5, size = 10)) # 标题居中调整 }) # 把所有子图拼接成网格,ncol控制列数(类似facet_wrap的ncol) final_plot <- wrap_plots(plot_list, ncol = 2) # 查看结果 print(final_plot)
方法2:用基础循环+gridExtra(适合习惯基础R的用户)
如果不想用tidyverse系列包,用基础循环也能实现:
library(ggcorrplot) library(gridExtra) # 获取所有唯一的region类别 all_regions <- unique(data$region) # 初始化空列表存放每个组的图 plot_list <- list() # 循环每个region生成对应图 for (idx in seq_along(all_regions)) { # 提取当前region的子集数据 sub_data <- subset(data, region == all_regions[idx]) # 计算相关矩阵 corr_matrix <- round(cor(sub_data[,18:24], use = "complete.obs"), 2) # 生成图并加入列表 plot_list[[idx]] <- ggcorrplot(corr_matrix) + ggtitle(paste("区域:", all_regions[idx])) + theme(plot.title = element_text(hjust = 0.5, size = 10)) } # 拼接成网格图 grid.arrange(grobs = plot_list, ncol = 2)
为啥直接用facet_wrap不行?
简单说,facet_wrap是基于长格式数据的分组映射,它需要你的数据是一行一个观测、带分组变量的结构;但ggcorrplot的输入是宽格式的相关矩阵,它的图层是针对整个矩阵生成的热图,没法直接被facet拆分。所以必须先按分组拆分原始数据,分别计算每个组的相关矩阵、生成单图,最后把这些单图拼在一起,就能实现类似分面的效果啦~
内容的提问来源于stack exchange,提问作者A.G.
相关产品推荐
相关产品推荐

