如何在ggplot中创建一个facet,除了使用不同的变量

Chr*_*ris 18 r ggplot2

我有一个包含3个变量的数据框,这些变量都是风速.我想通过相互绘制所有变量来检查硬件的校准程度.虽然在这种情况下有三个,但最多可能有6个.

这将导致3个不同的图形,其中xy参数不断变化.我真的很想用平面来绘制这些 - 或者具有相同外观的东西.

以下是一些示例数据,在一个名为的数据框中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)

这使:

在ggplot中绘制对

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)

赠送:

自定义版本的对情节