r - 如何在ggplot中创建构面,除非使用不同的变量

标签 r ggplot2

我有一个包含3个变量的数据框,它们都是风速。我想通过绘制所有变量之间的相互关系来检查硬件的校准程度。尽管在这种情况下有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


我希望绘制三个正方形图。可以通过调用来绘制一个人

ggplot() + geom_point(data=wind, aes(wind[,1],wind[,3]), alpha=I(1/30), 
                      shape=I(20), size=I(1))


知道我该怎么做吗?

最佳答案

这样会做吗?

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")


如果需要密度,那么我们可以将第二段代码提取到一个辅助函数中:

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")


给予:

关于r - 如何在ggplot中创建构面,除非使用不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5511990/

相关文章:

r - Windows R 的 Kerberos 身份验证

r - `data.table` 基于 `agrep` 选择子集的方法?

r - ggplot 省略了多边形孔

r - 在ggplot map 上叠加多边形

r - 在 roxygen2 中使用 @ 符号

r - 基于最短地理距离匹配数据框

r - 具有多个组的 stat_compare_means

r - 如何创建要插入到 ggplot 中的对象(当有多个带 + 的部分时)?

r - ggplot2:来自 alpha 的颜色不一致

r - 我如何使用带有离散轴值的 geom_rect