我有一个包含3个变量的数据框,这些变量都是风速.我想通过相互绘制所有变量来检查硬件的校准程度.虽然在这种情况下有三个,但最多可能有6个.
这将导致3个不同的图形,其中x和y参数不断变化.我真的很想用平面来绘制这些 - 或者具有相同外观的东西.
以下是一些示例数据,在一个名为的数据框中wind:
wind <- structure(list(speed_60e = c(3.029, 3.158, 2.881, 2.305, 2.45,
2.358, 2.325, 2.723, 2.567, 1.972, 2.044, 1.745, 2.1, 2.08, 1.914,
2.44, 2.356, 1.564, 1.942, 1.413, 1.756, 1.513, 1.263, 1.301,
1.403, 1.496, 1.828, 1.8, 1.841, 2.014), speed_60w = c(2.981,
3.089, 2.848, 2.265, 2.406, 2.304, 2.286, 2.686, 2.511, 1.946,
2.004, 1.724, 2.079, 2.058, 1.877, 2.434, 2.375, 1.562, 1.963,
1.436, 1.743, 1.541, 1.256, 1.312, 1.402, 1.522, 1.867, 1.837,
1.873, 2.055), speed_40 = c(2.726, 2.724, 2.429, 2.028, 1.799,
1.863, 1.987, 2.445, 2.282, 1.938, 1.721, 1.466, 1.841, 1.919,
1.63, 2.373, 2.22, 1.576, 1.693, 1.185, 1.274, 1.421, 1.071,
1.163, 1.166, 1.504, 1.77, 1.778, 1.632, 1.545)), .Names = c("speed_60e",
"speed_60w", "speed_40"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
"25", "26", "27", "28", "29", "30"))
R> head(wind)
speed_60e speed_60w speed_40
1 3.029 2.981 2.726
2 3.158 3.089 2.724
3 2.881 2.848 2.429
4 2.305 2.265 2.028
5 2.450 2.406 1.799
6 2.358 2.304 1.863
Run Code Online (Sandbox Code Playgroud)
我想绘制三个方形图.可以通过调用绘制单个的
ggplot() + geom_point(data=wind, aes(wind[,1],wind[,3]), alpha=I(1/30),
shape=I(20), size=I(1))
Run Code Online (Sandbox Code Playgroud)
知道我怎么能这样做吗?
Rei*_*son 26
会这样吗?
plotmatrix(data = wind) + geom_smooth(method="lm")
Run Code Online (Sandbox Code Playgroud)
这使:

Hadley称之为"原油实验散点图矩阵",但它可能满足您的需求?
编辑:目前,plotmatrix()还不够灵活,无法处理@Chris关于geom_point()图层规范的所有要求.但是,我们可以plotmatrix()利用Hadley的优秀代码来创建绘图所需的数据结构,但我们可以使用标准ggplot()调用来绘制它.此功能也会降低密度,但您可以查看代码plotmatrix()以了解如何获取它们.
首先,一个函数将数据从宽格式扩展到对映射所需的重复格式,其中我们将每个变量相互映射,而不是自身.
Expand <- function(data) {
grid <- expand.grid(x = 1:ncol(data), y = 1:ncol(data))
grid <- subset(grid, x != y)
all <- do.call("rbind", lapply(1:nrow(grid), function(i) {
xcol <- grid[i, "x"]
ycol <- grid[i, "y"]
data.frame(xvar = names(data)[ycol], yvar = names(data)[xcol],
x = data[, xcol], y = data[, ycol], data)
}))
all$xvar <- factor(all$xvar, levels = names(data))
all$yvar <- factor(all$yvar, levels = names(data))
all
}
Run Code Online (Sandbox Code Playgroud)
注意: 所有这一切都是从Hadley的代码中窃取plotmatrix()- 我在这里没有做任何想法.
展开数据:
wind2 <- Expand(wind)
Run Code Online (Sandbox Code Playgroud)
现在我们可以将其绘制为以下所需的任何其他长格式数据对象ggplot():
ggplot(wind2, aes(x = x, y = y)) +
geom_point(alpha = I(1/10), shape = I(20), size = I(1)) +
facet_grid(xvar ~ yvar, scales = "free")
Run Code Online (Sandbox Code Playgroud)
如果你想要密度,那么我们可以将代码二中的代码拉出一个辅助函数:
makeDensities <- function(data) {
densities <- do.call("rbind", lapply(1:ncol(data), function(i) {
data.frame(xvar = names(data)[i], yvar = names(data)[i],
x = data[, i])
}))
densities
}
Run Code Online (Sandbox Code Playgroud)
然后计算原始数据的密度:
dens <- makeDensities(wind)
Run Code Online (Sandbox Code Playgroud)
然后使用相同的代码添加plotmatrix():
ggplot(wind2, aes(x = x, y = y)) +
geom_point(alpha = I(1/10), shape = I(20), size = I(1)) +
facet_grid(xvar ~ yvar, scales = "free")+
stat_density(aes(x = x, y = ..scaled.. * diff(range(x)) + min(x)),
data = dens, position = "identity", colour = "grey20",
geom = "line")
Run Code Online (Sandbox Code Playgroud)
我在上面展示的原始图的完整版本,但使用提取的代码将是:
ggplot(wind2, aes(x = x, y = y)) +
geom_point(alpha = I(1/10), shape = I(20), size = I(1)) +
facet_grid(xvar ~ yvar, scales = "free")+
stat_density(aes(x = x, y = ..scaled.. * diff(range(x)) + min(x)),
data = dens, position = "identity", colour = "grey20",
geom = "line") +
geom_smooth(method="lm")
Run Code Online (Sandbox Code Playgroud)
赠送:
