【问题标题】:Multiple QQ Plots on Data Set with Unknown number and name of variables具有未知数量和变量名称的数据集上的多个 QQ 图
【发布时间】:2020-10-26 06:04:58
【问题描述】:

我想在 chem 数据上生成 qqplots 和线条,这些数据作为 excel 文件提供给我,其中包含未知数量的变量和未知数量的观察结果,然后将每个图存储为数据对象,例如 qqplot1、qqplot2、3、4,等以供稍后包含在摘要报告中。我正在编写一个通用脚本来在数据集上运行它们,并且变量的数量和名称会有所不同。

  1. 脚本的第一部分创建了一个数据框 (df),这几乎就是我从 excel 导入后的样子。这个有变量(As、Ba、Cu),每个变量的观察次数各不相同。
As = c(10, 20, 10, 12, 7, 14, 6, 9, 11, 15)
Ba = c(110, 120, 210, 112, 97, 214, 116, 211, 115, NA)
Cu = c(1, 1, 2, 11, 9, 21, 16, 19, NA, NA )
df = data.frame(As, Ba, Cu)

我可以通过先旋转然后绘图来分面包装所有变量。请参阅下面的代码。 R 中的枢轴为列提供了列的通用名称(namevalue)。当只有三个变量时这很好,但如果有 20 个或最多 50 个变量,则不是很好。

理想情况下,我想将每个图保存为按顺序编号的对象,以便以后包含在摘要 HTML 或 PDF 报告中。

欢迎任何想法。 RM

df_l = pivot_longer(df, cols = everything())

qqplot <- ggplot(data = df_l, mapping = aes(sample = value)) +
  stat_qq_band(alpha=0.5) +
  stat_qq_line() +
  stat_qq_point() +
  facet_wrap(~ name, scales = "free") +
  labs(x = "Theoretical Quantiles", y = "Sample Quantiles")
qqplot

PS:我有点走这条路,但希望它在 ggplot 中,我不知道如何按顺序编号保存它们。

par(mfrow=c(1,1))
for (i in 1:ncol(df[,1: ncol(df) - 0 ])){  
  qqnorm(df[, i], main = names(df[i]))
  qqline(df[, i])
}

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    也许这就是你要找的。使用例如purrr::imap(或lapply 或...)可以这样实现:

    1. 将 qqplot 的代码放入函数中

    2. name分割你的长df

    3. 使用purrr::imap 循环分割的df

      • 使用imap 的优点是可以将分割的名称或变量的名称传递给函数,这样可以很容易地为绘图添加标题。
      • 为情节命名的第二个选项是保留facet_wrap,这将产生类似于情节标题的刻面

    因此,您会得到一个命名的 qqplots 列表:

    As = c(10, 20, 10, 12, 7, 14, 6, 9, 11, 15)
    Ba = c(110, 120, 210, 112, 97, 214, 116, 211, 115, NA)
    Cu = c(1, 1, 2, 11, 9, 21, 16, 19, NA, NA )
    df = data.frame(As, Ba, Cu)
    
    library(ggplot2)
    library(tidyr)
    library(purrr)
    library(qqplotr)
    
    df_l = pivot_longer(df, cols = everything())
    
    my_qqplot <- function(.data, .title) {
      ggplot(data = .data, mapping = aes(sample = value)) +
        stat_qq_band(alpha=0.5) +
        stat_qq_line() +
        stat_qq_point() +
        facet_wrap(~ name, scales = "free") +
        labs(x = "Theoretical Quantiles", y = "Sample Quantiles", title = .title)
    }
    
    qqplots <- df_l %>% 
      split(.$name) %>% 
      imap(my_qqplot)
    
    qqplots$As # or qqplots[[1]]
    

    【讨论】:

    • 太棒了。之前没用过purr。谢谢。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2021-04-19
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多