带误差线的 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))]
最后,我添加了列 var1
和 var2
来描述哪些变量被 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))
情节
是否有任何 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))]
最后,我添加了列 var1
和 var2
来描述哪些变量被 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))
情节