我有一个包含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
我希望绘制三个方形图。可以通过调用
绘制单个的一个ggplot() + geom_point(data=wind, aes(wind[,1],wind[,3]), alpha=I(1/30),
shape=I(20), size=I(1))
知道我该怎么做吗?
答案 0 :(得分:26)
会这样吗?
plotmatrix(data = wind) + geom_smooth(method="lm")
给出了:
Hadley称之为“原始实验散点图矩阵”,但它可能满足您的需求?
编辑目前,plotmatrix()
不够灵活,无法处理@Chris关于geom_point()
图层规范的所有要求。但是,我们可以使用Hadley的漂亮代码来创建绘图所需的数据结构,从而减少plotmatrix()
的内容,但是我们喜欢使用标准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
}
注意: 所有这样做会从plotmatrix()
窃取Hadley的代码 - 我在这里没有做任何想法。
展开数据:
wind2 <- Expand(wind)
现在我们可以将其绘制为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")
如果你想要密度,那么我们可以将这一部分代码2拉出一个辅助函数:
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
}
然后计算原始数据的密度:
dens <- makeDensities(wind)
然后使用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")
我在上面展示的原始图的完整版本,但使用提取的代码将是:
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")
,并提供:
答案 1 :(得分:4)
首先融化数据(将其转换为长格式)。
mwind <- melt(wind)
ggplot(mwind, aes(value)) + geom_histogram() + facet_wrap(~ variable)
如果要绘制点,则需要为x轴添加索引变量。
答案 2 :(得分:4)
ggpairs
包的 GGally
非常适合快速比较数据框中的每个变量:
ggpairs(wind)
它还将处理数字和因子数据的比较。