В чем разница между facet_wrap () и facet_grid () в ggplot2?

80

Я читал ggplot2документацию по обеим функциям. Мне было интересно, в чем разница и какая ситуация будет правильной для использования каждой функции ( facet_wrap()и facet_grid()).

library(ggplot2)

p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl)

p + facet_grid(~ cyl)

Я привожу этот небольшой пример в качестве отправной точки. Разница, кажется, заключается в том, что обертка делает графики более автономными, а сетка делает все вместе.

марбель
источник

Ответы:

60

Ответ ниже относится к случаю, когда у вас есть 2 аргумента в facet_grid()или facet_wrap().

facet_grid(x ~ y)будет отображать x*yграфики, даже если некоторые из них пусты. Пример:

library(ggplot2)
g <- ggplot(mpg, aes(displ, hwy))

Существует 4 различных цил и 7 различных значений класса.

g + geom_point(alpha=1/3) + facet_grid(cyl~class)

Выше показано 4 * 7 = 28 графиков, даже если некоторые из них пусты (потому что некоторые классы не имеют соответствующих значений цилиндров, например, строки с class = "midsize" не имеют соответствующего значения cyl = "5") facet_wrap(x ~ y)на другом рука, отображает только графики, имеющие фактические значения.

g + geom_point(alpha=1/3) + facet_wrap(cyl~class)

Сейчас отображается 19 графиков, по одному для каждой комбинации цилиндра и класса.

Абхиджит Шарма
источник
25

facet_wrap(...)строки вместе ggplotsв разных фреймах (фасетах) на основе одной переменной. facet_grid(...)может принимать две переменные:

p + facet_grid(cyl~class)

Вы также можете использовать третью переменную для группировки по каждому аспекту:

qplot(displ, hwy, data=mpg,color=factor(year)) + facet_grid(cyl~class)

показывает улучшение (или его отсутствие) в пробеге по шоссе по сравнению с смещением по # цилиндрам и классу.

jlhoward
источник
11
facet_wrapтакже может принимать две переменные.
marbel
9

Для графиков с одной переменной вы можете использовать facet_grid()или facet_wrap().

facet_wrap(~variable)вернет симметричную матрицу графиков для количества уровней variable.

facet_grid(.~variable)вернет грани, равные уровням, variableраспределенным по горизонтали.

facet_grid(variable~.)вернет грани, равные уровням, variableраспределенным по вертикали.

Крис Баскервиль
источник
1
Вы знаете, почему это так, facet_wrap(~variable)а почему нет facet_wrap(variable~)?
amsquareb 01
9

Цитата в основном из книги ggplot2, стр. 148f.

Есть три типа фаски:

  • facet_null() : одиночный сюжет, значение по умолчанию.
  • facet_wrap() : "оборачивает" 1d ленту панелей на 2d.
  • facet_grid() : создает 2-мерную сетку панелей, определяемых переменными, которые образуют строки и столбцы.

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

Фацетное обертывание

facet_wrap()создает длинную ленту панелей (генерируемую любым количеством переменных) и оборачивает ее в 2d. Это полезно, если у вас есть одна переменная с множеством уровней и вы хотите упорядочить графики более рациональным образом.

Вы можете контролировать то, как лента свернута в сетку с ncol, nrow, as.tableи dir. ncolи nrowконтролировать количество столбцов и строк (вам нужно установить только один). as.tableуправляет расположением фасетов в виде таблицы ( TRUE) с максимальными значениями в правом нижнем углу или графика ( FALSE) с максимальными значениями в правом верхнем углу. dirуправляет направление обертки: ч orizontal или против ertical.

Сетка фасетов

From ?facet_grid: facet_grid()формирует матрицу панелей, определяемую переменными фасетирования строк и столбцов. Это наиболее полезно, когда у вас есть две дискретные переменные, и все комбинации переменных существуют в данных.

Вы можете использовать несколько переменных в строках или столбцах, «сложив» их вместе, например a + b ~ c + d.

facet grid()имеет дополнительный параметр space, который принимает те же значения, что и scales.

# If scales and space are free, then the mapping between position
# and values in the data will be the same across all panels. This
# is particularly useful for categorical axes
ggplot(subset(mpg, manufacturer %in% c("audi", "honda", "toyota")) , aes(drv, model)) +
    geom_point() +
    facet_grid(manufacturer ~ ., scales = "free", space = "free") +
    theme(strip.text.y = element_text(angle = 0))

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

(упрощенный) Пример взят из ?facet_grid

Маркус
источник