6

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

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

我的阴谋

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

A 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 不再工作了,有没有办法改变颜色?

4

2 回答 2

14

您没有wrap正确使用 - 有关详细信息,请参阅小插图。同样对于对角线,您现在必须使用该函数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))
于 2016-06-17T21:06:13.210 回答
4

wrap() 您可以使用此处解释的方法修改 GGally 函数的一些参数。但并非所有参数都被命名为wrap有用。例如,如果您尝试使用手动色标更改默认调色板,wrap您可能会收到类似Error in wrap("cor",…) all parameters must be named arguments. 在这种情况下,您可以构建自定义函数来生成适用于矩阵图的上部、下部或对角线部分的任何类型的 ggplot 对象。

但是,如果您想更改某些参数(未在要wrapped 的 GGally 函数中命名)而不创建自定义函数来设计 ggplot 对象,则有一个(更安全的)快捷方式。您只需在函数调用中调用已经存在的 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"))}))
于 2017-10-26T22:43:05.500 回答