You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:33:21