19

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

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

4 回答 4

6

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

ggpairs

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

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

我们可能希望它做它所说的。两个重要说明:

  • 颜色和填充 aes 应包含在ggpairs调用的省略号中

  • aes_string()用来

让我们试试这个:

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

在此处输入图像描述

太好了,我们快到了!我们只需要覆盖调色板。请注意,您提出的类似建议

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

将不起作用,因为 ggpairs 对象不是 ggplot,因此该+符号不能以任何方式直接适用。但是,此处提供了简单的解决方法。交叉你的手指,然后...

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

在此处输入图像描述

于 2013-12-02T07:40:11.197 回答
5

更新:

GGAlly 再次更新,这个答案中的 hack不再起作用,但最后有一个非 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

之前的情节

为了修改绘图,需要修改绘图对象中的各个字符串以包含附加命令。为此,我们使用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'))

情节之后

于 2015-06-02T08:14:37.683 回答
3

我觉得更改调色板最简单的方法是修改它自己的图形功能,因为它们返回可以自由定制的 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)) 

在此处输入图像描述

还有一些参数upperlower可以用于情节的其他部分。

于 2020-03-03T10:58:13.243 回答
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.

在此处输入图像描述

于 2021-03-13T15:23:17.537 回答