Совместное использование фасетных тегов и разделительных меток в ggplot2

Я хотел бы создать фигуру, используя ggplot2 facet_grid, как показано ниже:

# Load ggplot2 library for plotting
library(ggplot2)

# Plot dummy data
p <- ggplot(mtcars, aes(mpg, wt)) 
p <- p + geom_point() 
p <- p + facet_grid(gear ~ cyl)
print(p)

Это замечательно, но поскольку это будет статья в журнале, каждая панель также должна быть помечена буквами a, b, c и т. Д. В пакете egg есть отличная функция для этого под названием tag_facet, которая используется следующим образом:

# Load egg library for tagging
library(egg)
#> Warning: package 'egg' was built under R version 3.5.3
#> Loading required package: gridExtra

# Same plot but with tags for each facet
p <- ggplot(mtcars, aes(mpg, wt)) 
p <- p + geom_point() 
p <- p + facet_grid(gear ~ cyl)
tag_facet(p)

Создано 9 мая 2019 г. пакетом REPEX (v0.2.1)

По мере необходимости, я теперь, как буквенные надписи на каждой панели. Но, как видите, мои лейблы исчезли!

Мой вопрос: как сохранить этикетки с полосками при добавлении тегов?


person Lyngbakr    schedule 09.05.2019    source источник


Ответы (4)


Вы можете просмотреть код для tag_facet здесь. Как видите, функция явно и намеренно удаляет полосы фасетов (см. Также «значение» в документация). Вы можете исправить это, создав свою собственную функцию и просто удалив вызов theme из исходного кода:

tag_facet2 <- function(p, open = "(", close = ")", tag_pool = letters, x = -Inf, y = Inf, 
    hjust = -0.5, vjust = 1.5, fontface = 2, family = "", ...) {

    gb <- ggplot_build(p)
    lay <- gb$layout$layout
    tags <- cbind(lay, label = paste0(open, tag_pool[lay$PANEL], close), x = x, y = y)
    p + geom_text(data = tags, aes_string(x = "x", y = "y", label = "label"), ..., hjust = hjust, 
        vjust = vjust, fontface = fontface, family = family, inherit.aes = FALSE)
}

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

person iod    schedule 09.05.2019
comment
Спасибо за ответ (+1), @iod. Я заметил это в коде после того, как спросил. Я думаю, что более простым решением будет просто установить strip.text = element_text(), чтобы повторно ввести метки полос после добавления тегов. - person Lyngbakr; 09.05.2019
comment
Не уверен, почему это проще, но пусть будет по-своему. Сразу отмечу, что вам также нужно сбросить strip.background, чтобы получить прямоугольники полосок. Сравните свой результат с моим в двух ответах. - person iod; 09.05.2019
comment
Возможно, «проще» - не подходящее слово, но это определенно короче, чем переопределение функции тегов. - person Lyngbakr; 09.05.2019
comment
Думаю, это зависит от того, как часто вам нужно это делать. Сохраните функцию как файл и используйте ее при необходимости вместо вызова egg. Но YMMV, конечно. - person iod; 09.05.2019

С пакетом {tagger} это можно сделать немного проще. Вы можете установить tagger с помощью devtools::install_github("eliocamp/tagger"). После установки tagger давайте загрузим его.

library(tagger)
library(ggplot2)

# Plot dummy data
p <- ggplot(mtcars, aes(mpg, wt)) 
p <- p + geom_point() 
p + facet_grid(gear ~ cyl) + tag_facets()

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

person gbganalyst    schedule 30.07.2020

Это можно сделать, используя только geom_text():

data_text <- data.frame(
  cyl   = c(4, 6, 8, 4, 6, 8, 4, 6, 8),
  gear  = c(3, 3, 3, 4, 4, 4, 5, 5, 5)
  label = c('(a)', '(b)', '(c)', '(d)', '(e)', '(f)', '(g)', '(h)', '(i)')
)

ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
facet_grid(gear ~ cyl) +
geom_text(data=data_text, aes(x=12, y=5, label=label), fontface='bold', size=4)

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

person Jet    schedule 09.05.2019
comment
Вы можете добавить check_overlap = TRUE к geom_text, чтобы они выглядели лучше - person Tung; 10.05.2019

Конечно, сразу после того, как спросишь, найду решение. Проблема заключается в том, что tag_facet устанавливает метки полос на element_blank, что можно исправить, вызвав theme после вызова tag_facet.

# Load libraries
library(ggplot2)
library(egg)
#> Warning: package 'egg' was built under R version 3.5.3
#> Loading required package: gridExtra

# Create plot
p <- ggplot(mtcars, aes(mpg, wt)) 
p <- p + geom_point() 
p <- p + facet_grid(gear ~ cyl)
p <- tag_facet(p)
p <- p + theme(strip.text = element_text())
print(p)

Создано 9 мая 2019 г. пакетом REPEX (v0.2.1)

person Lyngbakr    schedule 09.05.2019
comment
Может быть, также strip.background = element_rect(), если вы хотите вернуть фон. - person Jet; 09.05.2019