Как отформатировать заголовок сетки и записи в ggplot2::facet_grid

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

Рассмотрим следующий MWE:

library(ggplot2)
ggplot(mpg, aes(displ, cty, fill=cyl)) + 
  geom_point() +
  scale_fill_continuous() +
  facet_grid(rows = vars(drv))

Я хотел бы заменить записи 4, f и r в правой части каждой строки символами (например, c("Case 1", "Case 2", "Case 3") и добавить заголовок справа от записей ( то есть между серым прямоугольником и легендой (cyl).

Документация для facet_grid мне не помогла - может ли кто-нибудь указать мне правильное направление?


person Ivo    schedule 28.05.2020    source источник


Ответы (2)


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

library(ggplot2)
ggplot(mpg, aes(displ, cty, fill=cyl)) + 
  geom_point() +
  scale_fill_continuous() +
  facet_grid(rows = vars(drv),
             labeller = as_labeller(c("4" = "Case1", "f" = "Case2", "r" = "Case3")))

Создана 28 мая 2020 г. в пакете reprex (v0.3.0)

РЕДАКТИРОВАТЬ:

Чтобы использовать дополнительный слой полосы в качестве связующего заголовка, вы можете использовать facet_nested() из ggh4x (полный отказ от ответственности: я собираю этот пакет).

library(ggplot2)
library(ggh4x)

ggplot(mpg, aes(displ, cty, fill=cyl)) + 
  geom_point() +
  scale_fill_continuous() +
  facet_nested(rows = vars("title", drv),
             labeller = as_labeller(c("4" = "Case1", "f" = "Case2", 
                                      "r" = "Case3", "title" = "My Title Here")))

Создана 28 мая 2020 г. в пакете reprex (v0.3.0)

Если вас не особенно заботит наличие полоски, вы можете использовать вспомогательную направляющую по оси Y.

library(ggplot2)
ggplot(mpg, aes(displ, cty, fill=cyl)) + 
  geom_point() +
  scale_fill_continuous() +
  facet_grid(rows = vars(drv),
             labeller = as_labeller(c("4" = "Case1", "f" = "Case2", "r" = "Case3"))) +
  guides(y.sec = guide_none("My Title Here"))

Создана 28 мая 2020 г. в пакете reprex (v0.3.0)

person teunbrand    schedule 28.05.2020
comment
Потрясающе, спасибо. Есть ли способ также добавить поле заголовка для этих трех случаев между серыми прямоугольниками и легендой cyl? - person Ivo; 28.05.2020
comment
Как дополнительная всеобъемлющая полоса? - person teunbrand; 28.05.2020
comment
Точно, как серая полоса, охватывающая все случаи (динамически; у меня есть несколько случаев в моем реальном графике)... - person Ivo; 28.05.2020
comment
@teunbrand Пожалуйста, рассмотрите вопрос о том, чтобы задать дополнительный вопрос, касающийся всеобъемлющего подхода, в виде отдельного вопроса-ответа. Это имеет мало общего с названием заголовка сетки. На мой взгляд, ваше дополнение заслуживает надлежащей записи, и будет легче искать людей, которые его ищут. - person KoenV; 28.05.2020
comment
@KoenV Я думаю, что люди обычно находят это через этот ответ stackoverflow.com/a/55911134/11374827 - person teunbrand; 28.05.2020
comment
Понял. Спасибо - person KoenV; 28.05.2020
comment
Упаковка выглядит потрясающе - спасибо за это! Он также предлагает много возможностей, о которых я даже не думал! :) - person Ivo; 28.05.2020
comment
Ошибка Error: (converted from warning) package 'ggplot2' was built under R version 3.6.3 (с использованием R 3.6.3) известна? Я продолжаю испытывать это и не могу установить пакет. - person Ivo; 28.05.2020
comment
Я скачал R3.6.3 локально и получил эту ошибку: Error: Failed to install 'ggh4x' from GitHub: (converted from warning) cannot remove prior installation of package ‘ellipsis’. Это исчезло, как только я переустановил пакет «многоточие». - person teunbrand; 28.05.2020

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

library(dplyr)
mpg_2 <- mpg %>%
  mutate(drv_2 = case_when(
    drv == "4" ~ "Case1",
    drv == "f" ~ "Case2",
    drv == "r" ~ "Case3" 
  ))

ggplot(mpg_2, aes(displ, cty, fill=cyl)) + 
  geom_point() +
  scale_fill_continuous() +
  facet_grid(rows = vars(drv_2))
person KoenV    schedule 28.05.2020