2013-02-05 79 views
15

我想更改GGally函数ggpairs的调色板。当我尝试将ggplot命令添加到使用getPlot返回的ggplot时,颜色不会改变。有没有办法使用ggplot更改GGally :: ggpairs的调色板?

my_pair_plot = ggpairs(dataset, color="var1") 
getPlot(my_pair_plot,2,1) + scale_fill_brewer(palette = "Set2") 

试图把ggplot命令直接对一个错误ggpairs函数的结果。

ggpairs(dataset, color="var1") + scale_fill_brewer(palette = "Set2") 

回答

5

原来,这是可能的!它需要查找源代码,但解决方案非常容易。我们感兴趣的是ggpairs功能,所以第一步就是

ggpairs 

让我们看看我们是否能够找到任何AES映射填充或颜色。事实上,

combo_aes <- addAndOverwriteAes(aes_string(x = xColName, 
      y = yColName, ...), section_aes) 

我们可能希望它做到了。两个重要的备注:

  • 颜色和填充AES应包含在省略号为ggpairs呼叫

  • aes_string()用于

让我们尝试了这一点:

ggpairs(diamonds[, 1:2], colour='cut') 

enter image description here

非常好,我们快到了!我们只需要覆盖调色板。需要注意的是像你提出

ggpairs(diamonds[, 1:2], colour='cut') + scale_fill_brewer(palette = "Set2") 

不会起作用,因为ggpairs对象不是ggplot,所以+符号是不能直接适用于任何方式。但是,简单的解决方法是提供here。用你的手指,并...

ggplot <- function(...) ggplot2::ggplot(...) + scale_fill_brewer(palette="Set2") 
ggpairs(diamonds[, 1:2], colour='cut') 

enter image description here

+1

不错的黑客!希望这可以保持良好的可靠性。 –

5

更新:

GGAlly再次更新,并在这个答案黑客不工作了,但总算有一个非-hack解决方案:给

scales <- scale_colour_brewer(type = 'qual') %+% scale_fill_brewer(type = 'qual') 

你可以做(​​在希望面向未来的方式)

for (row in seq_len(ps$nrow)) 
    for (col in seq_len(ps$ncol)) 
     ps[row, col] <- ps[row, col] + scales 

老办法

在其他答案的黑客不工作了,所以让我们来破解一个新的!

一个ggpairs对象的内部结构是数据集和字符串的列表:

> dta <- data.frame(a=1:6, b=7:12, c=c('f', 'g')) 
> ps <- ggpairs(dta, 1:2, colour = 'c') 
> str(ps) 
List of 10 
$ data  :'data.frame': 2 obs. of 3 variables: 
    ..$ a: int [1:2] 1 2 
    ..$ b: int [1:2] 3 4 
    ..$ c: int [1:2] 5 6 
$ columns  : int [1:3] 1 2 3 
$ plots  :List of 9 
    ..$ : chr "ggally_densityDiag(ggally_data, ggplot2::aes(x = a, colour = c))" 
    ..$ : chr "ggally_cor(ggally_data, ggplot2::aes(x = b, y = a, colour = c))" 

[...] 

$ gg   : NULL 
- attr(*, "class")= chr [1:2] "gg" "ggpairs" 

> ps 

plot before

为了修改的情节,在情节的对象的各个串需要进行修改以包含附加命令。为此,我们使用deparse(substitute(argument))获得包含用户通过代码的字符串,并将其追加到每一个情节电话:

add_to_plots <- function(pairs, modification) { 
    str <- deparse(substitute(modification)) 
    pairs$plots <- lapply(pairs$plots, function(s) paste(s, '+', str)) 
    pairs 
} 

> add_to_plots(ps, scale_colour_brewer(type = 'qual')) 

plot after

+0

这也不行了。我希望密度图中的diagonale没有填充,但是像这里显示的行 - 我该怎么做? http://stackoverflow.com/questions/34727408/how-do-i-have-the-density-plot-not-filled-in-ggallyggpairs – Make42

+0

这改变了颜色,但不是我的情节仍然充满的事实。 – Make42

+0

这是相当平凡的,只是覆盖填充。 –

相关问题