Подтвердить что ты не робот

Как создать грань в ggplot, за исключением различных переменных

У меня есть кадр данных с 3 переменными, которые являются всеми скоростями ветра. Я хочу проверить, насколько хорошо аппаратное обеспечение откалибровано, построив все переменные друг на друга. Хотя в этом случае их три, может быть, до 6.

Это приведет к появлению трех разных графиков, где параметры 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))

Любая идея, как я могу это сделать?

4b9b3361

Ответ 1

Будет ли что-то подобное делать?

plotmatrix(data = wind) + geom_smooth(method="lm")

Что дает:

pairs plotting in ggplot

Хэдли называет это "сырой экспериментальной матрицей рассеянного экрана", но это может быть достаточно для ваших нужд?

Изменить: В настоящее время plotmatrix() недостаточно гибкий, чтобы обрабатывать все требования @Chris относительно спецификации слоя geom_point(). Тем не менее, мы можем отрезать кишки из 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() - здесь я ничего не делал.

Разверните данные:

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

даяние:

custom version of the pairs plot

Ответ 2

Сначала расплавьте данные (преобразуйте их в длинную форму).

mwind <- melt(wind)
ggplot(mwind, aes(value)) + geom_histogram() + facet_wrap(~ variable)

Если вы хотите начертить точки, вам нужно добавить индексную переменную для оси x.

Ответ 3

ggpairs из пакета GGally довольно хорош для быстрого сравнения каждой переменной в фрейме данных:

ggpairs(wind)

GGally default plot with wind data

Он также будет обрабатывать сравнения числовых и факторных данных.