是否有任何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一起使用错误栏):
而
library(car)
spm(~X+Y+Z, data=df)
生成一个散点图矩阵,例如:
现在我的预期输出将是这样一个散点图矩阵(除了car
之外的任何其他包也可以),我还可以显示错误栏。 (请注意,并非所有变量都有错误,例如Z
没有错误)。此外,由spm
函数完成的拟合等是一个很好的噱头,但对我来说并不是必需的。
答案 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))]
最后,我添加了列var1
和var2
来描述选择了哪些变量:
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))
<强>剧情强>