我不知道如何使用 labeller 函数执行此操作,但另一种选择是创建一个分组变量,将所有三个分类变量组合成一个可用于分面的变量。这是一个使用内置mtcars 数据框和dplyr 包动态创建新分组变量的示例。紧随其后的是一个允许动态选择一到三个刻面变量的函数的更新。
library(dplyr)
ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")),
aes(wt,mpg)) +
geom_point() +
facet_wrap(~group)
更新:关于灵活性的评论,下面的代码是一个函数,允许用户输入所需的数据框和变量名称,包括动态选择一个、两个或三个方面列。
library(dplyr)
library(lazyeval)
mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) {
dat = dat %>%
mutate_(group =
if (is.na(f2)) {
f1
} else if (is.na(f3)) {
interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2))
} else {
interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3))
})
ggplot(dat, aes_string(v1,v2)) +
geom_point() +
facet_wrap(~group)
}
现在让我们试试这个功能:
library(vcd) # For Arthitis data frame
mygg(Arthritis, "ID","Age","Sex","Treatment","Improved")
mygg(mtcars, "wt","mpg","cyl","am")
mygg(iris, "Petal.Width","Petal.Length","Species")