2016-06-17 5 views
3

Я видел эти посты GGally::ggpairs plot without gridlines when plotting correlation coefficient use ggpairs to create this plotИзменение цвета в ggpairs теперь, когда Params осуждается

После прочтения я был в состоянии осуществить это взломать https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r и мой сюжет выглядит так

my plot

I думаю, что это хороший результат, но я не могу изменить цвета.

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"))) 

Но цвета остаются такими же. Есть ли способ изменить цвета теперь, когда параметры больше не работают?

ответ

5

Вы не используете wrap правильно - see the vignette for details. Кроме того, для диагонали теперь вы должны использовать функцию 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), чтобы изменить его цвет вам нужно определить вам собственную функцию, чтобы пройти. Так from here

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)) 
+1

спасибо большое, это очень ясно, и обеспечивает эффективное решение – pachamaltese

+0

вы очень радушны – user20650

1

Вы можете изменить некоторые параметры функций GGally используя wrap()as explained here. Но не все параметры называются для wrap. Например, если вы попытаетесь изменить палитру по умолчанию с ручной цветовой шкалой в пределах wrap, вы можете получить ошибку, такую ​​как Error in wrap("cor",…) all parameters must be named arguments. В этом случае вы можете построить custom functions для создания любого вида объекта ggplot, соответствующего верхнему, нижнему или диагональному участкам матрицы.

Однако, если вы хотите изменить некоторые параметры (не названные в функциях GGally, которые должны быть wrap), есть (безопаснее), не создавая настраиваемую функцию для создания объекта ggplot. Вы просто вызываете уже существующую функцию GGally в вызове функции, добавляя дополнительные параметры ggplot. Например, для обеспечения ручной шкалы цвета для трех категорий (в новом столбце швейцарскими $ групп):

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"))})) 
+0

Ths является также полезно, если вы хотите применить к каждому разделу разные элементы 'theme' (' upper', 'lower' или' diag'). Например, сохраняя сетки по умолчанию в 'lower' и' diag', но удаляя их в 'upper' – FairMiles