ggpairs 的自定义组均值函数
Custom group mean function for ggpairs
根据 GGally R 包中 ggpairs() 函数的文档,可以将自定义函数指定为 "lower"/"upper" 参数的输入。对于连续离散变量组合,我想简单地在分类变量的类别中显示连续变量的均值(最好使用点,而不是条),如果可能的话,使用颜色美学通过另一个分类变量进一步分层。
我在以下线程中找到了一些信息:
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)
根据@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
根据 GGally R 包中 ggpairs() 函数的文档,可以将自定义函数指定为 "lower"/"upper" 参数的输入。对于连续离散变量组合,我想简单地在分类变量的类别中显示连续变量的均值(最好使用点,而不是条),如果可能的话,使用颜色美学通过另一个分类变量进一步分层。
我在以下线程中找到了一些信息:
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)
根据@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