带有误差条的R散点图矩阵

时间:2015-07-13 09:56:02

标签: r ggplot2 scatter-plot

是否有任何R包/方法/函数提供将散点图矩阵绘制为here scatterplot.matrix包的car函数的功能,找到here )并根据询问和回答here绘制x和y错误栏。

一个例子:

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与Y一起使用错误栏): enter image description here

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

生成一个散点图矩阵,例如:enter image description here

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

1 个答案:

答案 0 :(得分:2)

数据

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轴分别为一列,误差条各加一列。

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

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

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

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))

<强>剧情

Scatterplot Matrix Scatterplot Matrix With Diagonal Element