ggplot2:将多变量facet_wrap标签放在一行上

时间:2016-05-10 17:09:05

标签: r ggplot2 facet facet-wrap

我使用facet_wrap将散点图分割为

facet_wrap(x~y+z)

根据需要在我的情况下生成22个图。但是,这22个图中的每个图的标签显示为3行(x,y和z),这不必要地消耗窗口中的空间并将图块拼成一个小区域。我宁愿希望我的情节更大。由于变量y和z很短,我想将它们显示在同一行而不是两行中。

我查看了贴标机选项,但它们似乎都没有做我想要的。我很感激这里的任何建议。

2 个答案:

答案 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))

有关详情,请参阅herehere

答案 1 :(得分:8)

我不确定如何使用贴标机功能,但另一种选择是创建一个分组变量,将所有三个分类变量组合成一个可用于分面的变量。以下是使用内置mtcars数据框和dplyr包来动态创建新分组变量的示例。接下来是一个带有函数的更新,允许动态选择一到三个分面变量。

library(dplyr)

ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")), 
       aes(wt,mpg)) +
  geom_point() +
  facet_wrap(~group)

enter image description here

更新:关于灵活性的评论,下面的代码是一个允许用户输入所需数据框和变量名称的函数,包括动态选择一个,两个或三个方面列。

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")

enter image description here