2013-02-05 77 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

這是相當平凡的,只是覆蓋填充。 –

相關問題