有没有办法使用ggplot更改GGally :: ggpairs的调色板?

时间:2013-02-05 15:56:36

标签: r ggplot2 palette

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

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

4 个答案:

答案 0 :(得分:6)

事实证明,这是可能的!它需要查找源代码,但解决方案很容易实现。我们对ggpairs函数感兴趣,所以第一步就是

ggpairs

让我们看看我们是否可以找到任何aes映射来填充或着色。的确,

combo_aes <- addAndOverwriteAes(aes_string(x = xColName, 
            y = yColName, ...), section_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 :(得分:6)

更新

GGAlly再次更新,此答案中的黑客不再有效,但最后还有一个非黑客解决方案:给定

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

答案 2 :(得分:2)

我觉得更改调色板的最简单的方法是修改其自己的绘图功能,因为它们会返回可以自由定制的ggplot2对象。

要更改对角线的密度,只需更改相应的函数ggally_densityDiag


modified_density = function(data, mapping, ...) {

  ggally_densityDiag(data, mapping, ...) + scale_fill_brewer(type = "qual", palette = "Set2")
}

然后,向ggparis函数调用提供新功能,如下所示,


ggpairs(iris, columns = 1:3,  aes(color = Species),
        diag = list(continuous = modified_density)) 

enter image description here

还有upperlower自变量也可以用于绘图的其他部分。

答案 3 :(得分:0)

将矩阵图分配给一个变量,然后使用 for 循环遍历每个图似乎也能解决问题:

library(GGally)

plot.matrix <-ggpairs(iris,aes(color= Species), upper = list(continuous = wrap("cor", size=6)))

for(i in 1:5) {
  for(j in 1:5){
    plot.matrix[i,j] <- plot.matrix[i,j] +
      scale_fill_brewer(palette = "Dark2") +
      scale_color_brewer(palette = "Dark2")
  }
}

plot.matrix

示例是从 Schmuller (2018) 修改而来的:R Projects for dummies,p。 149.

enter image description here