2016-06-17 56 views
3

我看到了這些帖子 GGally::ggpairs plot without gridlines when plotting correlation coefficient use ggpairs to create this plot改變顏色已被棄用

讀我能實現這個破解https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r和我的情節是這樣的

my plot

我後認爲這是一個很好的結果,但我不能改變顏色。

一個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 ped)而沒有創建自定義函數來設計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是如果您想要爲每個部分應用不同的'主題'元素('upper','lower'或'diag'),也很有用。例如,在'lower'和'diag'中默認保持網格,但在'upper'中刪除它們 – FairMiles