Ответ 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))
Я использую facet_wrap, чтобы разделить график рассеяния как
facet_wrap(x~y+z)
Это дает 22 графика в моем случае по желанию. Однако метка для каждого из этих 22 графиков отображается в 3 строках (x, y и z), которые излишне расходуют пространство в окне и скручивают графики в маленькую область. Я бы предпочел, чтобы мои сюжеты были больше по размеру. Поскольку переменные y и z короткие, я хотел бы отображать их в одной строке вместо двух.
Я заглянул в варианты шаблонов, но никто из них, похоже, не делает то, что я хочу. Я был бы признателен за любые предложения здесь.
В этом случае вы также можете рассмотреть label_wrap_gen()
:
p <- ggplot(mtcars, aes(wt,mpg)) + geom_point()
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))
Я не уверен, как это сделать с помощью функции 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")