Яка різниця між 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)

показує поліпшення (або його відсутність) у пробігу на довжину проти переміщення на # циліндри та клас.


11
facet_wrapтакож може приймати дві змінні.
марбель

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

9

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

Існує три типи фасетування:

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

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

Фасетне обгортання

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.