График ggpairs с тепловой картой значений корреляции
Мой вопрос двоякий;
У меня есть график ggpairs по умолчанию upper = list(continuous = cor)
и я хотел бы раскрасить плитки по значениям корреляции (точно так же, как делает ggcorr).
У меня есть это:
Мне бы хотелось, чтобы значения корреляции на приведенном выше графике были окрашены следующим образом:
library(GGally)
sample_df <- data.frame(replicate(7,sample(0:5000,100)))
colnames(sample_df) <- c("KUM", "MHP", "WEB", "OSH", "JAC", "WSW", "gaugings")
ggpairs(sample_df, lower = list(continuous = "smooth"))
ggcorr(sample_df, label = TRUE, label_round = 2)
Я кратко попытался использовать upper = list(continuous = wrap(ggcorr)
но не повезло, и, учитывая, что обе функции возвращают вызовы сюжета, я не думаю, что это правильный путь?
Я знаю, что мог бы встроить это в ggplot (например , решение Сэнди Маспратта), но, учитывая, что пакет GGally уже обладает функциональностью, которую я ищу, я подумал, что могу что-то упустить.
В более широком смысле, я хотел бы знать, как мы, или если мы можем, назвать значения корреляции? Более простым вариантом может быть цвет надписей, а не плитки (т. Е. Этот вопрос с использованием цвета, а не размера), но мне нужна переменная для присвоения цвету...
Возможность вызывать значения корреляции для использования на других графиках была бы полезной, хотя я полагаю, что я мог бы просто пересчитать их сам.
Спасибо!
1 ответ
Возможное решение - получить список цветов из ggcorr
матрицу корреляции и установить эти цвета в качестве фона в верхних тайлах ggpairs
матрица графиков.
library(GGally)
library(mvtnorm)
# Generate data
set.seed(1)
n <- 100
p <- 7
A <- matrix(runif(p^2)*2-1, ncol=p)
Sigma <- cov2cor(t(A) %*% A)
sample_df <- data.frame(rmvnorm(n, mean=rep(0,p), sigma=Sigma))
colnames(sample_df) <- c("KUM", "MHP", "WEB", "OSH", "JAC", "WSW", "gaugings")
# Matrix of plots
p1 <- ggpairs(sample_df, lower = list(continuous = "smooth"))
# Correlation matrix plot
p2 <- ggcorr(sample_df, label = TRUE, label_round = 2)
График корреляционной матрицы:
# Get list of colors from the correlation matrix plot
library(ggplot2)
g2 <- ggplotGrob(p2)
colors <- g2$grobs[[6]]$children[[3]]$gp$fill
# Change background color to tiles in the upper triangular matrix of plots
idx <- 1
for (k1 in 1:(p-1)) {
for (k2 in (k1+1):p) {
plt <- getPlot(p1,k1,k2) +
theme(panel.background = element_rect(fill = colors[idx], color="white"),
panel.grid.major = element_line(color=colors[idx]))
p1 <- putPlot(p1,plt,k1,k2)
idx <- idx+1
}
}
print(p1)
Вы можете отобразить цвет фона на ячейку, написав быструю пользовательскую функцию, которую можно передать непосредственно ggpairs
, Это включает в себя вычисление корреляции между парами переменных, а затем сопоставление с некоторым заданным пользователем цветовым диапазоном.
my_fn <- function(data, mapping, method="p", use="pairwise", ...){
# grab data
x <- eval_data_col(data, mapping$x)
y <- eval_data_col(data, mapping$y)
# calculate correlation
corr <- cor(x, y, method=method, use=use)
# calculate colour based on correlation value
# Here I have set a correlation of minus one to blue,
# zero to white, and one to red
# Change this to suit: possibly extend to add as an argument of `my_fn`
colFn <- colorRampPalette(c("blue", "white", "red"), interpolate ='spline')
fill <- colFn(100)[findInterval(corr, seq(-1, 1, length=100))]
ggally_cor(data = data, mapping = mapping, ...) +
theme_void() +
theme(panel.background = element_rect(fill=fill))
}
Используя данные в ответе Марко:
library(GGally) # version: ‘1.4.0’
p1 <- ggpairs(sample_df,
upper = list(continuous = my_fn),
lower = list(continuous = "smooth"))
Который дает: