Разместите полосовые панели на противоположных сторонах участка - PullRequest
3 голосов
/ 05 января 2020

В некоторых журналах требуется, чтобы на рисунках с несколькими графиками каждый из графиков обозначался буквами. Я пытаюсь сделать то же самое с facet_wrap в ggplot2, потому что я организовал данные таким образом, что ковариаты для всех моих объясняющих переменных находятся в одном столбце, а переменные группировки для ковариат находятся в другом столбце.

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

Но мне все еще нужно метки для каждого графика (столбец figure.letters) на рисунке, предпочтительно в верхнем левом углу. Я попытался добавить его в формулу facet_wrap, поэтому теперь на каждом графике есть две полосы.

require(ggplot2)
my.df <- data.frame(
  param = rep(c('Distance (km)', 'Energy (j)', 'Girth (m)', 'Height (cm)', 'Incline (degrees)'), each = 20),
  explanatory = rnorm(100, 0, 1),
  response = rnorm(100, 0, 1),
  figure.letter = rep(LETTERS[1:5], each = 20)
)

ggplot(my.df, aes(x = explanatory, y = response)) +
  geom_point() +
  facet_wrap(. ~ param + figure.letter, strip.position = 'bottom') +
  theme_bw() +
  theme(
    strip.placement = 'bottom',
    strip.background = element_blank()
  )

enter image description here

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

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

Есть ли способ взять панель полосы для figure.letter и переместить ее наверх, сохраняя панель полосы для param внизу?

Ответы [ 2 ]

2 голосов
/ 06 января 2020

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

Если у вас разные пределы оси для разных аспекты, тогда, скорее всего, единственным вариантом будет маршрут лоскутного одеяла.

require(ggplot2)
#> Loading required package: ggplot2

set.seed(1234)
my.df <- data.frame(
  param = rep(c('Distance (km)', 'Energy (j)', 'Girth (m)', 'Height (cm)', 'Incline (degrees)'), each = 20),
  explanatory = rnorm(100, 0, 1),
  response = rnorm(100, 0, 1)
)

df.label <- data.frame(
  param = unique(my.df$param),
  x = -2.8,
  y = 3.6,
  figure.letter = LETTERS[1:5]
)

ggplot(my.df, aes(x = explanatory, y = response)) +
  geom_point() +
  geom_text(
    data = df.label, aes(x = x, y = y, label = figure.letter),
    hjust = 0, vjust = 0
  ) +
  facet_wrap(. ~ param, strip.position = 'bottom') +
  coord_cartesian(
    xlim = c(-2.8, 2.8),
    ylim = c(-3.3, 3.3),
    expand = FALSE,
    clip = "off"
  ) +
  theme_bw() +
  theme(
    strip.placement = 'bottom',
    strip.background = element_blank(),
    plot.margin = margin(16.5, 5.5, 5.5, 5.5))
#> Warning: Suppressing axis rendering when strip.position = 'bottom' and
#> strip.placement == 'outside'

Создано в 2020-01-05 пакетом Представить (v0.3.0)

1 голос
/ 07 января 2020

Бросив мою шляпу в кольцо для моего собственного вопроса, объединив сценарий, который @Claus выдвинул, где ось x могла иметь разные пределы (таким образом, используя лоскутное одеяло), и предложение @camille для разделения данных, а затем с помощью cowplot.

ОБНОВЛЕНИЕ Теперь включает в себя дополнительное предложение @Claus использовать аргумент plotlist в plot_grid для построения списка графиков.

#== Required Packages
require(ggplot2)
require(cowplot)

#== Make a Dataset
my.df <- data.frame(
  param = rep(c('Distance (km)', 'Energy (j)', 'Girth (m)', 'Height (cm)', 'Incline (degrees)'), each = 20),
  explanatory = c(rnorm(20, 0, 1), rnorm(20, 40, 30), 
                  rnorm(20, -5, 0.5), rnorm(20, 100, 300),
                  rnorm(20, 0.1, 0.02)),
  response = rnorm(100, 0, 1)
)

#==Split, Plot, and Save
my.list <- lapply(split(my.df, my.df$param), function(x){
  ggplot(x, aes(x = explanatory, y = response)) +
    xlab(unique(x$param)) +
    geom_point() +
    theme_bw() +
    theme(
      strip.placement = 'bottom',
      strip.background = element_blank()
    )
})

#==Plot Grid
plot_grid(plotlist = my.list, labels = 'AUTO')

enter image description here Не так грациозно, как у @ Клауса.

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