Измените цвета в 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, чтобы быть wrapped) без создания пользовательской функции для разработки объекта 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"))}))
Другие вопросы по тегам