Многостраничный вывод граненых и выровненных участков - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь объединить ограненные боксы с одинаково ограненными линейными участками, оба из которых должны быть правильно выровнены, чтобы было ясно, какие графики принадлежат друг другу. На самом деле я могу достичь именно того, что хочу, используя ggpubr::ggarrange() вот так (я назову это макетом 2x4, то есть 2 строки по 4 столбца):

В действительности, хотя у меня намного больше классов, чем 4 (например, n_classes = 21, но число может меняться в зависимости от базовых данных), так что я получаю график 2x21, который не читается. Теперь я хочу разбить весь сюжет 2x21 на страницы сюжетов 2x4, в идеале при сохранении общей легенды, чтобы размеры точек оставались сопоставимыми на разных страницах. Какой лучший подход для этого?

[Я видел, что ggarrange() имеет многостраничную поддержку (см. http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/81-ggplot2-easy-way-to-mix-multiple-graphs-on-the-same-page/#annotate-the-arranged-figure), но я думаю, что это не работает в моем случае из-за используемой огранки. Кажется, нет способа сообщая ggarrange(), что p_top и p_bottom состоят из 4 столбцов в каждом.]

Используемый код

library(tidyverse)
library(ggpubr)

# create dummy data with two groups (period and class)
n <- 1e4
n_classes <- 4
p_classes <- sample(seq(0.1, 0.9, length.out = n_classes))
dt <- tibble(
    period = sample(c("161", "162", "171", "172"), size = n, replace = TRUE),
    class = sample(LETTERS[1:n_classes], size = n, prob = p_classes, replace = TRUE),
    value = sample(0:20, size = n, replace = TRUE)
)

# total counts by period and group
dt2 <- dt %>% 
    group_by(period, class) %>% 
    summarise(total = n()) %>% 
    left_join(dt, by = c("period", "class"))

# plot the total counts by period (faceted by class)
p_top <- ggplot(dt2, aes(x = period, y = total, group = 1)) +
    facet_wrap(~ class, nrow = 1, scales = "free_y") +
    theme_bw() +
    theme(strip.background = element_blank(),
          strip.text.x = element_blank(),
          axis.title.x = element_blank(),
          axis.text.x = element_blank(),
          axis.ticks.x = element_blank()) +
    geom_line() +
    geom_point(aes(size = total), shape = 21, fill = "white") +
    scale_y_continuous(limits = c(0, NA))

# values boxplot by period (faceted by class)
p_bottom <- ggplot(dt2, aes(x = period, y = value)) +
    facet_wrap(~ class, nrow = 1, scales = "fixed") +
    theme_bw() +
    theme(plot.margin = unit(c(-0.6, 1, 1, 1), units = "lines")) +
    geom_boxplot(width = 0.7, outlier.shape = NA, fill = "lightgray")

# arrange top and bottom plots
ggarrange(p_top, p_bottom, nrow = 2, align = "v",
          heights = c(1, 3),
          common.legend = TRUE, legend = "bottom")

Создано в 2018-07-02 пакетом Представ (v0.2.0).

...