Заполнить фасет

Насколько я могу сказать facet_wrap заполняется строкой. Точно так же вы можете указать, как заполнить matrix с помощью byrow Я надеялся, что вы можете сделать то же самое с facet_wrap. Я знаю, что могу переупорядочить уровни фактора для построения в этом манере, но это похоже на немного работу, если есть более короткий метод, который я пропускаю.

library(ggplot2)

ggplot(mtcars, aes(x=gear,  y=mpg, fill=vs)) +
    geom_bar(position="dodge", stat="identity") + 
    facet_wrap(~ carb, ncol=2)  #fills by row

Как мы можем заполнить столбец?

Ответ 1

Это можно сделать путем преобразования переменной фасетки в коэффициент и последующего повторного выравнивания. В функции relevel.byrow я использовал matrix(..., byrow=T) для упорядочения уровня, затем преобразовал эту матрицу в вектор, используя функцию c(), а затем повторно выровненный фактор.

#number of columns
nc <- 2
level.byrow <- function(vec, nc){
  fac <- factor(vec) #if it is not a factor
  mlev <- matrix(levels(fac), nrow=nc, byrow=T)
  factor(fac, levels= c(mlev))
}

library(plyr)
ggplot(transform(mtcars, rcarb=level.byrow(carb, nc)), aes(x=gear,  y=mpg, fill=vs)) +
  geom_bar(position="dodge", stat="identity") + 
  facet_wrap(~ rcarb, ncol=nc)

Я использовал plyr для удобства, вы просто можете написать

mtcars$rcarb <- level.byrow(mtcars$carb, nc)

Это также работает, когда у нас нет полной структуры фасета, но дает пару предупреждений.

mtcars2 <- subset(mtcars, carb!=3)
ggplot(transform(mtcars2, rcarb=level.byrow(carb, nc)), aes(x=gear,  y=mpg, fill=vs)) +
  geom_bar(position="dodge", stat="identity") + 
  facet_wrap(~ rcarb, ncol=nc)

Результат с carb==3 исключен:

enter image description here

Ответ 2

Эта функция реализована в текущей версии ggplot2 на github. Это commit реализует новый параметр dir of facet_wrap, поэтому вы просто делаете

## "v" for vertical or "h" for horizontal (the default)    
ggplot(...) + facet_wrap(~ carb, ncol=2, dir="v")

Обратите внимание, что эта функция в настоящее время недоступна в версии на CRAN.