Ggplot2: Поместите метки с переменной переменной facet_wrap на одну строку

Я использую facet_wrap, чтобы разделить график рассеяния как

facet_wrap(x~y+z)

Это дает 22 графика в моем случае по желанию. Однако метка для каждого из этих 22 графиков отображается в 3 строках (x, y и z), которые излишне расходуют пространство в окне и скручивают графики в маленькую область. Я бы предпочел, чтобы мои сюжеты были больше по размеру. Поскольку переменные y и z короткие, я хотел бы отображать их в одной строке вместо двух.

Я заглянул в варианты шаблонов, но никто из них, похоже, не делает то, что я хочу. Я был бы признателен за любые предложения здесь.

Ответ 1

В этом случае вы также можете рассмотреть label_wrap_gen():

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

Подробнее см. здесь здесь и здесь.

Ответ 2

Я не уверен, как это сделать с помощью функции 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")

введите описание изображения здесь