带误差线的 R 散点图矩阵

R scatterplot matrix with error bars

是否有任何 R package/method/function 提供将散点图矩阵绘制为 here (scatterplot.matrix function of the car package, found here) AND to plot x and y errorbars as has been asked and answered 的功能。

一个例子:

set.seed(123)
df <- data.frame(X = rnorm(10), errX = rnorm(10)*0.1, Y = rnorm(10), errY = rnorm(10)*0.2, Z = rnorm(10))
require(ggplot2)
ggplot(data = df, aes(x = X, y = Y)) + geom_point() + 
  geom_errorbar(aes(ymin = Y-errY, ymax = Y+errY)) + 
  geom_errorbarh(aes(xmin = X-errX, xmax = X+errX)) + theme_bw()

生成以下图(X vs Y 带误差线):

同时

library(car)
spm(~X+Y+Z, data=df)

生成如下散点图矩阵:

现在我的预期输出将是这样一个散点图矩阵(除 car 之外的任何其他包都可以),我还可以在其中显示错误栏。 (请注意,并非我的所有变量都有错误,例如 Z 没有)。 spm 函数在这里完成的拟合等也是一个不错的噱头,但对我来说不是必需的。

数据

set.seed(123)
df <- data.frame(X = rnorm(10), errX = rnorm(10)*0.1,
                 Y = rnorm(10), errY = rnorm(10)*0.2,
                 Z = rnorm(10))

代码

library(ggplot2)
library(gtools)
valCols <- c("X", "Y", "Z")
errCols <- setNames(c("errX", "errY", NA), valCols)
combn <- permutations(length(valCols), 2, valCols)

mdf <- do.call(rbind,
               apply(combn, 1, function(ind) {
                  df[["NA.Column"]] <- NA
                  errC <- errCols[ind]
                  errC[is.na(errC)] <- "NA.Column"
                  vals <- setNames(data.frame(df[, ind]), paste0("val", seq_along(ind)))
                  errs <- setNames(data.frame(df[, errC]), paste0("err", seq_along(errC)))
                  ret <- cbind(vals, errs)
                  ret$var1 <- factor(ind[1], levels = valCols)
                  ret$var2 <- factor(ind[2], levels = valCols)
                  ret
               }))

(p <- ggplot(mdf, aes(x = val1, y = val2, 
                      ymin = val2 - err2, ymax = val2 + err2,
                      xmin = val1 - err1, xmax = val1 + err1)) +
         geom_point() + 
         geom_errorbar() + geom_errorbarh() + 
         facet_grid(var1 ~ var2, drop = FALSE))

说明

首先,您必须以 ggplot2 喜欢的方式转换数据。也就是说,x 轴和 y 轴各一列,误差线各一列。

我在这里使用的是 library(gtools) 中的函数 permutations,其中 returns(在本例中)是所有 2 个元素的排列。对于这些排列中的每一个,我 select 来自原始数据集的相应列并添加相关的错误列(如果存在)。如果列名遵循值和错误栏列的特定模式,您可以使用 regex 自动确定这些,如:

valCols <- names(df)[grepl("^[A-Z]$", names(df))]

最后,我添加了列 var1var2 来描述哪些变量被 selected:

head(mdf)
#          val1       val2        err1        err2 var1 var2
# 1 -0.56047565 -1.0678237  0.12240818  0.08529284    X    Y
# 2 -0.23017749 -0.2179749  0.03598138 -0.05901430    X    Y
# 3  1.55870831 -1.0260044  0.04007715  0.17902513    X    Y
# 4  0.07050839 -0.7288912  0.01106827  0.17562670    X    Y
# 5  0.12928774 -0.6250393 -0.05558411  0.16431622    X    Y
# 6  1.71506499 -1.6866933  0.17869131  0.13772805    X    Y

以这种方式转换数据使得生成散点图矩阵变得相当容易。使用这种方法,还可以修改对角线面板,如下例所示:

p + geom_text(aes(ymin = NULL, ymax = NULL, xmin = NULL, xmax = NULL), 
              label = "X",
              data = data.frame(var1 = "X", var2 = "X", 
                                val1 = 0, val2 = 0))

情节