2017-08-30 171 views
0

根据GGally R包中ggpairs()函数的文档,可以指定自定义函数作为“lower”/“upper”参数的输入。对于连续离散变量组合,我想简单地在分类变量的类别中显示连续变量的方法(最好使用点而不是小节),如果可能的话,使用颜色美学进一步分类为另一个分类变量。ggpairs的自定义组均值函数

我发现下面的线程的一些信息:

https://github.com/ggobi/ggally/issues/218

但是我ggpairs(和GGPLOT2)的知识太肤浅到能够生产从模板等自定义函数的线程(同样,变量名称“Species”似乎被硬编码到模板中,如果可能的话,我宁愿在自定义函数中没有任何硬编码信息)。

如果有人能用模板或解决方案的草图帮助我,我将不胜感激。使用下面的例子(其中“custom_function”需要与上述功能所取代):

dat <- reshape::tips 
pm <- ggpairs(dat, 
       mapping = aes(color = sex, alpha = 0.3), 
       columns = c("total_bill", "smoker", "time", "tip"), 
       showStrips = T, 
       lower = list(combo = custom_function)) 
print(pm) 
+1

[这个问题](https://github.com/ggobi/ggally/issues/139)有一些编写自定义函数的好例子。我不认为你的问题会变得很复杂,因为如果你只想每个组的组含义,你应该可以使用'stat_summary'和'ggstance :: stat_summaryh'。然而,我的猜测是你需要一个'if'语句来表示数字和分类y,而链接中的'eval'代码可能对此有用。 – aosmith

+0

@aosmith非常感谢,我根据你的建议起草了一个函数,似乎可以做到这一点。但是,我对分类变量的标签有点困惑。我会很感激任何建议。 –

+1

搞清楚这一切都好;你应该把它作为一个答案,而不是编辑你的问题。我同意在整个矩阵中读取轴标签是很困难的;如果你喜欢外观,将'axisLabels'设置为“内部”可能会有所帮助。另一个选择是使用“box”而不是默认的“box_no_facet”作为上三角形的“combo”。 – aosmith

回答

1

基于@aosmith的我做这似乎工作不够好,我的目的自定义函数的评论,没有广泛的测试它,到目前为止,但也许这是有帮助的呢:

library(GGally) 
library(ggplot2) 
library(ggstance) 

gmean_point <- function(data, mapping, ...) { 

    x <- eval(mapping$x, data) 
    y <- eval(mapping$y, data) 

    if(is.numeric(y)) { 
    p <- ggplot(data) + 
     geom_blank(mapping) + 
     stat_summary(mapping, 
        geom = 'point', fun.y = mean, 
        position = position_dodge(width = 0.2)) 
    } else { 
    p <- ggplot(data) + 
     geom_blank(mapping) + 
     stat_summaryh(mapping, 
        geom = 'point', fun.x = mean, 
        position = position_dodgev(height = 0.2)) 
    } 

    p 

} 

pm <- ggpairs(reshape::tips, 
       mapping = aes(color = sex, alpha = 0.3), 
       columns = c("total_bill", "smoker", "time", "tip"), 
       showStrips = T, 
       lower = list(combo = gmean_point), 
       upper = list(combo = 'box')) 
print(pm) 

Plot produced by code above