Как создать фасет в ggplot, кроме как с разными переменными - PullRequest
18 голосов
/ 01 апреля 2011

У меня есть фрейм данных с 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))

Есть идеи, как мне это сделать?

Ответы [ 3 ]

26 голосов
/ 01 апреля 2011

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

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

4 голосов
/ 27 марта 2013

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

ggpairs(wind)

GGally default plot with wind data

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

4 голосов
/ 01 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...