Измените цвета в ggpairs теперь, когда params устарела
Я видел эти посты GGally::ggpairs без линий сетки при построении графика коэффициента корреляции. Используйте ggpairs для создания этого графика.
После прочтения я смог реализовать этот хак https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r и мой сюжет выглядит так
Я думаю, что это хороший результат, но я не могу изменить цвета.
А MWE это
library(ggally)
# load the hack
source("ggally_mod.R")
# I saved https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r as "ggally_mod.R"
assignInNamespace("ggally_cor", ggally_cor, "GGally")
ggpairs(swiss)
Теперь я хочу бежать
ggpairs(swiss,
lower=list(continuous="smooth", wrap=c(colour="blue")),
diag=list(continuous="bar", wrap=c(colour="blue")))
Но цвета остаются такими же. Есть ли способ изменить цвета теперь, когда params больше не работает?
2 ответа
Вы не используете wrap
правильно - см. виньетку для деталей. Также для диагонали теперь нужно использовать функцию barDiag
(но ggpairs
дает очень полезные ошибки, чтобы сказать это)
Так что для вашего примера мы можем изменить colour
из точек в нижних панелях и fill
из баров ниже
library(GGally)
library(ggplot2)
ggpairs(swiss[1:3],
lower=list(continuous=wrap("smooth", colour="blue")),
diag=list(continuous=wrap("barDiag", fill="blue")))
Тем не менее, как цвет гладкой жестко закодированы (см. ggally_smooth
), чтобы изменить его цвет, вам нужно определить собственную функцию для передачи. Итак, отсюда
my_fn <- function(data, mapping, pts=list(), smt=list(), ...){
ggplot(data = data, mapping = mapping, ...) +
do.call(geom_point, pts) +
do.call(geom_smooth, smt)
}
# Plot
ggpairs(swiss[1:4],
lower = list(continuous =
wrap(my_fn,
pts=list(size=2, colour="red"),
smt=list(method="lm", se=F, size=5, colour="blue"))),
diag=list(continuous=wrap("barDiag", fill="blue")))
Аналогичным образом, вот способ определения новой функции верхней корреляции (аналогично тому, что у вас есть)
cor_fun <- function(data, mapping, method="pearson", ndp=2, sz=5, stars=TRUE, ...){
data <- na.omit(data[,c(as.character(mapping$x), as.character(mapping$y))])
x <- data[,as.character(mapping$x)]
y <- data[,as.character(mapping$y)]
corr <- cor.test(x, y, method=method)
est <- corr$estimate
lb.size <- sz* abs(est)
if(stars){
stars <- c("***", "**", "*", "")[findInterval(corr$p.value, c(0, 0.001, 0.01, 0.05, 1))]
lbl <- paste0(round(est, ndp), stars)
}else{
lbl <- round(est, ndp)
}
ggplot(data=data, mapping=mapping) +
annotate("text", x=mean(x), y=mean(y), label=lbl, size=lb.size,...)+
theme(panel.grid = element_blank())
}
ggpairs(swiss,
lower=list(continuous=wrap("smooth", colour="blue")),
diag=list(continuous=wrap("barDiag", fill="blue")),
upper=list(continuous=cor_fun))
Вы можете изменить некоторые параметры функций GGally, используя wrap()
как объяснено здесь. Но не все параметры названы для wrap
быть полезным. Например, если вы попытаетесь изменить палитру по умолчанию с ручной цветовой шкалой в пределах wrap
Вы можете получить ошибку, как Error in wrap("cor",…) all parameters must be named arguments
, В этом случае вы можете создавать пользовательские функции для генерации любого вида объекта ggplot, подходящего для верхнего, нижнего или диагонального участков матричного графика.
Тем не менее, есть (более безопасный) ярлык, если вы хотите изменить некоторые параметры (не названные в функциях GGally, чтобы быть wrap
ped) без создания пользовательской функции для разработки объекта ggplot. Вы просто вызываете уже существующую функцию GGally в вызове функции, добавляя дополнительные параметры ggplot. Например, чтобы предоставить цвет ручной шкалы для трех категорий (в новом столбце swiss$groups):
swiss$groups <- gl(n = 3, k = 1, length = nrow(swiss), labels = c("A", "B", "C"))
ggpairs(swiss, mapping = aes(colour = groups), columns = 1:6,
upper = list(continuous = function(data, mapping, ...) {
ggally_cor(data = data, mapping = mapping, size = 2) + scale_colour_manual(values = c("black", "dark green", "red"))}),
lower = list(continuous = function(data, mapping, ...) {
ggally_smooth(data = data, mapping = mapping, alpha = .2) + scale_colour_manual(values = c("black", "dark green", "red"))}),
diag = list(continuous = function(data, mapping, ...) {
ggally_barDiag(data = data, mapping = mapping, alpha = .5) + scale_fill_manual(values = c("black", "dark green", "red"))}))