Ответ 1
Будет ли что-то подобное делать?
plotmatrix(data = wind) + geom_smooth(method="lm")
Что дает:
Хэдли называет это "сырой экспериментальной матрицей рассеянного экрана", но это может быть достаточно для ваших нужд?
Изменить: В настоящее время 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")
даяние: