基于R语言按Scan分组制作多元素QQ图矩阵的技术求助
实现QQ图矩阵的具体R代码
1. 准备模拟数据(替换为你的真实数据)
先构造符合需求的数据集,包含扫描组、元素、晶粒尺寸三个字段:
library(tidyverse) library(ggplot2) library(patchwork) # 用于拼接图形 library(GGally) # 用于ggpairs矩阵 # 模拟数据:3个扫描组,4个元素,每个元素100个晶粒尺寸数据 set.seed(123) # 保证结果可重复 df <- expand.grid(ScanGroup = c("a", "b", "c"), Element = c("s", "fe", "cr", "zr"), id = 1:100) %>% mutate(GrainSize = case_when( Element == "s" ~ rnorm(300, mean = 10, sd = 2), Element == "fe" ~ rnorm(300, mean = 15, sd = 3), Element == "cr" ~ rnorm(300, mean = 20, sd = 2.5), Element == "zr" ~ rnorm(300, mean = 25, sd = 4) )) %>% select(-id)
2. 方法一:用ggplot2 + patchwork 批量生成扫描组QQ图矩阵
这种方法直观易懂,新手易调整样式:
第一步:定义QQ图复用函数
# 自定义单个元素的QQ图函数 plot_qq <- function(data, element_name) { data_sub <- data %>% filter(Element == element_name) ggplot(data_sub, aes(sample = GrainSize)) + stat_qq() + stat_qq_line(color = "red") + labs(title = element_name, x = "理论分位数", y = "晶粒尺寸") + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) }
第二步:批量生成每个扫描组的QQ图矩阵
# 遍历每个扫描组,生成对应的2x2 QQ图矩阵 scan_groups <- unique(df$ScanGroup) for (group in scan_groups) { # 筛选当前扫描组的数据 group_data <- df %>% filter(ScanGroup == group) # 生成四个元素的QQ图 p_s <- plot_qq(group_data, "s") p_fe <- plot_qq(group_data, "fe") p_cr <- plot_qq(group_data, "cr") p_zr <- plot_qq(group_data, "zr") # 拼接成2x2矩阵,添加扫描组标题 combined_plot <- (p_s + p_fe) / (p_cr + p_zr) + plot_annotation(title = paste("扫描组", group), theme = theme(plot.title = element_text(size = 16, hjust = 0.5))) # 显示图形 print(combined_plot) # 可选:保存图形到本地 # ggsave(paste0("QQ_matrix_scan_group_", group, ".png"), combined_plot, width = 10, height = 8) }
3. 方法二:用GGally::ggpairs 生成全QQ图矩阵
如果坚持用ggpairs,需要自定义绘图函数替换默认的上下三角和对角线图形:
第一步:自定义ggpairs兼容的QQ图函数
# 自定义用于ggpairs的QQ图函数 ggpairs_qq <- function(data, mapping, ...) { ggplot(data, mapping) + stat_qq() + stat_qq_line(color = "red") + theme_bw() }
第二步:按扫描组生成全QQ图矩阵
for (group in scan_groups) { group_data <- df %>% filter(ScanGroup == group) %>% # 转换为宽格式:每个元素作为一列,方便ggpairs处理 pivot_wider(names_from = Element, values_from = GrainSize) # 生成ggpairs矩阵,所有子图都用自定义QQ图函数 qq_matrix <- ggpairs(group_data, columns = c("s", "fe", "cr", "zr"), upper = list(continuous = ggpairs_qq), lower = list(continuous = ggpairs_qq), diag = list(continuous = ggpairs_qq), title = paste("扫描组", group)) + theme_bw() # 显示图形 print(qq_matrix) # 可选:保存图形 # ggsave(paste0("ggpairs_QQ_matrix_scan_group_", group, ".png"), qq_matrix, width = 12, height = 10) }
关键说明
- 替换模拟数据:把开头的
df换成你自己的真实数据集,确保列名(ScanGroup、Element、GrainSize)和格式匹配。 - 样式调整:可在
plot_qq或ggpairs_qq函数里修改主题、颜色、标签等,比如更换theme_bw()为其他主题,调整stat_qq_line的颜色。 - 批量生成:两种方法都用循环遍历扫描组,自动生成每个组的图形,满足你“多次生成矩阵”的需求。
内容的提问来源于stack exchange,提问作者MikeZ
相关产品推荐
相关产品推荐

