更改 ggpairs 中的颜色,因为不推荐使用 params

Change colors in ggpairs now that params is deprecated

我看到了这些帖子 GGally::ggpairs plot without gridlines when plotting correlation coefficient use ggpairs to create this plot

阅读后我能够实现这个 hack https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r 我的情节看起来像这样

我认为这是一个很好的结果,但我无法更改颜色。

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

但颜色保持不变。既然 params 不再起作用,有没有办法改变颜色?

您没有正确使用 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),要更改其 颜色你需要定义你自己的函数来传递。所以

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, ...){

    x <- eval_data_col(data, mapping$x)
    y <- eval_data_col(data, 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, na.rm=TRUE), y=mean(y, na.rm=TRUE), 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))

您可以使用 wrap() as explained here. But not all parameters are named for wrap to be useful. For example, if you try to change default palette with a manual colour scale within wrap you may get an error like Error in wrap("cor",…) all parameters must be named arguments. In that case you may build custom functions 修改 GGally 函数的一些参数,以生成适合矩阵图上部、下部或对角线部分的任何类型的 ggplot 对象。

但是,如果您想在不创建自定义函数来设计 ggplot 对象的情况下更改某些参数(未在要 wrapped 的 GGally 函数中命名),则有一个(更安全的)快捷方式。您只需在函数调用中调用一个已经存在的 GGally 函数,添加额外的 ggplot 参数。例如,为三个类别(在新列 swiss$groups 中)提供手动比例颜色:

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