Это, вероятно, невозможно при использовании ggcorrplot
, который принимает в качестве входных данных корреляционную матрицу и переплавляет ее в подходящий фрейм данных, который затем используется для некоторых конкретных вещей ggplot
для построения графика.
Но вы можете использовать исходный код ggcorrplot
, чтобы получить то, что хотите.
В качестве предварительного шага давайте рассмотрим «расплавленную» корреляционную матрицу.
(small_cor <- cor(replicate(2, rnorm(25))))
#> [,1] [,2]
#> [1,] 1.00000000 0.06064063
#> [2,] 0.06064063 1.00000000
(reshape2::melt(small_cor))
#> Var1 Var2 value
#> 1 1 1 1.00000000
#> 2 2 1 0.06064063
#> 3 1 2 0.06064063
#> 4 2 2 1.00000000
Это версия корреляционной матрицы в формате данных, где каждая строка представляет собой корреляцию для комбинации переменных из исходных данных.
Теперь мы приступим к работе с некоторыми примерами данных. Есть 6 регионов и 7 переменных.
library(tidyverse)
library(reshape2)
my_data <- data.frame(region = factor(rep(1:6, each = 25)),
replicate(7, rnorm(6*25)))
Нам нужны расплавленные корреляционные матрицы с идентификаторами регионов. Вот как я это сделал. Может есть более приятный способ. Я думаю, что это может быть самое сложное, что вам придется сделать.
my_cors <- cbind(region = factor(rep(levels(my_data$region), each = 7^2)),
do.call(rbind, lapply(split(my_data, my_data$region), function(x) melt(cor(x[,-1])))))
Теперь я скопирую и вставлю исходный код ggcorrplot
. Сначала вставил из списка аргументов, чтобы получить некоторые значения по умолчанию:
ggtheme = ggplot2::theme_minimal
colors = c("blue", "white", "red")
outline.color = "gray"
legend.title = "Corr"
tl.cex = 12
tl.srt = 45
Теперь я вырезаю и вставляю соответствующие части ggcorrplot
и вставляю facet_wrap
в конце, чтобы получить то, что вы хотели.
my_cors %>%
ggplot(aes(Var1, Var2, fill = value)) +
geom_tile(color = outline.color) +
scale_fill_gradient2(low = colors[1],
high = colors[3],
mid = colors[2],
midpoint = 0,
limit = c(-1, 1),
space = "Lab",
name = legend.title) +
ggtheme() + theme(axis.text.x = element_text(angle = tl.srt,
vjust = 1,
size = tl.cex, hjust = 1),
axis.text.y = ggplot2::element_text(size = tl.cex)) +
coord_fixed() +
facet_wrap("region", ncol=2)
person
ngm
schedule
05.04.2018