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

ggplot2: Put multi-variable facet_wrap labels on one line

我正在使用 facet_wrap 将散点图拆分为

facet_wrap(x~y+z)

在我的案例中,这会根据需要生成 22 个图。但是,这 22 个地块中的每一个的标签都显示在 3 行(x、y 和 z)中,这不必要地消耗了 window 中的 space 并将地块挤压到一个小区域。我宁愿希望我的地块更大。由于变量 y 和 z 很短,我想将它们显示在同一行而不是两行。

我查看了贴标机选项,但 none 似乎符合我的要求。如果有任何建议,我将不胜感激。

我不确定如何使用标签函数执行此操作,但另一种选择是创建一个分组变量,将所有三个分类变量组合成一个可用于分面的变量。下面是一个使用内置 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")

在这种情况下,您还可以考虑 label_wrap_gen():

p <- ggplot(mtcars, aes(wt,mpg)) + geom_point() 
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))

有关详细信息,另请参阅 here and here

这对我来说是最热门的搜索结果,所以我添加了一个包含 2022 年知识的答案。ggplot 的 labeller() 方法现在有一个 .multi_line 参数,当 FALSE , 将 comma-separate 分面标签,包括是否要使用自定义标签。

library(tidyverse)

ggplot(mtcars, aes(wt,mpg)) +
    geom_point() +
    facet_wrap(~ cyl + gear + carb, labeller = 
        labeller(
            cyl = ~ paste("Cylinder: ", .),
            gear = ~ paste("Gear: ", .),
            carb = ~ paste("Carb: ", .),
            .multi_line = FALSE
        )
    )