我使用facet_wrap将散点图分割为
facet_wrap(x~y+z)
根据需要在我的情况下生成22个图。但是,这22个图中的每个图的标签显示为3行(x,y和z),这不必要地消耗窗口中的空间并将图块拼成一个小区域。我宁愿希望我的情节更大。由于变量y和z很短,我想将它们显示在同一行而不是两行中。
我查看了贴标机选项,但它们似乎都没有做我想要的。我很感激这里的任何建议。
答案 0 :(得分:17)
在这种情况下,您可能还会考虑label_wrap_gen()
:
p <- ggplot(mtcars, aes(wt,mpg)) + geom_point()
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))
答案 1 :(得分:8)
我不确定如何使用贴标机功能,但另一种选择是创建一个分组变量,将所有三个分类变量组合成一个可用于分面的变量。以下是使用内置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")