Создание темы фасета / графика дизайна в ggplot2 без использования facet_ - PullRequest
0 голосов
/ 05 мая 2020

Есть ли возможность создать график, выглядящий как facet_wrap, в ggplot2 без использования facet_wrap() Причина, по которой я хотел бы добиться этого, состоит в том, чтобы соответствовать другому дизайну. На графике without_facet ниже, могу ли я как-то добавить «Сетоса» вверху, чтобы он выглядел как график with_facet, без использования facet_wrap.

library(ggplot2)

df <- iris[iris$Species == 'setosa', ]

with_facet <- ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() +facet_wrap(~Species)
with_facet

without_facet <- ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()

Ответы [ 4 ]

2 голосов
/ 05 мая 2020

Вы можете попробовать

ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + 
   geom_point() + 
   ggtitle("setosa")  + 
   theme(plot.title = element_text(hjust = 0.5))

enter image description here

Еще "hacki sh" - можно было бы использовать такой жестко запрограммированный подход:

ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point() + 
  ggtitle("setosa")  + 
  geom_rect(xmin = 4.225, xmax = 5.875 , ymin=4.5, ymax=4.6, fill ="lightgrey") + 
  coord_cartesian(clip = 'off', expand = 0.05) +
  theme(plot.title = element_text(hjust = 0.5, size = 12),
        plot.margin = margin(t = 30, r = 20, b = 20, l = 20, unit = "pt"))

enter image description here

0 голосов
/ 05 мая 2020

Из ответа Paleolimbot на Gitbub (https://github.com/tidyverse/ggplot2/issues/2344)

element_textbox <- function(...) {
  el <- element_text(...)
  class(el) <- c("element_textbox", class(el))
  el
}

element_grob.element_textbox <- function(element, ...) {
  text_grob <- NextMethod()
  rect_grob <- element_grob(calc_element("strip.background", theme_bw()))

  ggplot2:::absoluteGrob(
    grid::gList(
      element_grob(calc_element("strip.background", theme_bw())),
      text_grob
    ),
    height = grid::grobHeight(text_grob), 
    width = grid::unit(1, "npc")
  )
}

Из моего исходного вопроса я добавил theme_bw()

library(ggplot2)
library(gridExtra)

df <- iris[iris$Species == 'setosa', ]

with_facet <- ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() +
  facet_wrap(~Species) + 
  theme(plot.background = element_rect(color = 'black')) + theme_bw()

without_facet <- ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point() + 
  ggtitle("setosa")  + 
  theme_bw() +
  theme(
    plot.title = element_textbox(
      hjust = 0.5, margin = margin(t = 5, b = 5), size = 10
    ),
  )

grid.arrange(with_facet, without_facet)

enter image description here

Не идентично, но работает для моих целей.

0 голосов
/ 05 мая 2020

Это может быть один вариант:


library(ggplot2)

df <- iris[iris$Species == 'setosa', ]

# with annotate:


with_annotate <-
  ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point() +
  annotate('text', x = 5, y = 4.7, label = "setosa", size = 12)

with_annotate

#or if you do not want the heading to print over the plot area

with_coord_cart <-
  ggplot(df, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point() +
  annotate('text', x = 5, y = 4.7, label = "setosa", size = 8)+
  coord_cartesian(ylim = c(2, 4.5), clip = 'off') +
  theme(plot.margin = margin(2, 1, 1, 1, "lines"))


with_coord_cart


Что дает вам:

enter image description here

0 голосов
/ 05 мая 2020

Примечание: я удалил его, потому что после обновления исходного вопроса он казался утратившим актуальность.

Я не уверен, что правильно понял. Если вы хотите расположить разные участки вместе:

library(gridExtra)

grid.arrange(without_facet,
             without_facet,
             without_facet,
             without_facet, nrow = 2)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...