Контролирующая прокладка гробов добавлена ​​в пэчворк

Это проблема, связанная с этот вопрос. ОП попросил способ расположить части участка на определенных расстояниях. Я думаю, что Тюнбранд дал очень хороший ответ.

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

Наличие более коротких этикеток выявляет проблему - при добавлении гроба лоскутное одеяло центрирует этот гроб, в основном равномерно заполняя его со всех сторон.

Мой вопрос: знаете ли вы, как управлять этим поведением заполнения?

Cowplot (или любой другой пакет, объединяющий ggplot для этого) также очень приветствуется.

library(tidyverse)
library(patchwork)
data <- midwest %>% 
  head(5) %>% 
  select(2,23:25) %>%
  pivot_longer(cols=2:4,names_to="Variable", values_to="Percent") %>% 
  mutate(Variable=factor(Variable, 
                         levels=c("percbelowpoverty","percchildbelowpovert","percadultpoverty"),
                         labels = paste0("perc", 1:3)))

p1 <- 
  ggplot(data=data, mapping=aes(x=county, y=Percent, fill=Variable)) +
  geom_col() + 
  scale_fill_manual(values = c("#CF232B","#942192","#000000")) +
  theme(legend.background = element_rect(fill = "grey50"))

p_legend <- cowplot::get_legend(p1)

p_main <- p1 <- 
  ggplot(data=data, mapping=aes(x=county, y=Percent, fill=Variable)) +
  geom_col(show.legend = FALSE) + 
  scale_fill_manual(values = c("#CF232B","#942192","#000000"))

p_main + plot_spacer() + p_legend + 
  plot_layout(widths = c(12.5, 1.5, 4)) &
  theme(plot.margin = margin(),
        plot.background = element_rect(colour = "black"))

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

Создано 2021-04-09 пакетом REPEX (v1.0.0)


person tjebo    schedule 09.04.2021    source источник


Ответы (1)


Насколько я понимаю, проблема не на стороне patchworks. Взглянув на схему gtable легенды, мы видим, что она состоит из 5 строк и 5 столбцов и что легенда должна быть помещена в ячейку в центре:

p_legend <- cowplot::get_legend(p1)
p_legend
#> TableGrob (5 x 5) "guide-box": 2 grobs
#>                                     z     cells                  name
#> 99_a788e923bf245af3853cee162f5f8bc9 1 (3-3,3-3)                guides
#>                                     0 (2-4,2-4) legend.box.background
#>                                               grob
#> 99_a788e923bf245af3853cee162f5f8bc9 gtable[layout]
#>                                     zeroGrob[NULL]
gtable::gtable_show_layout(p_legend)

Следовательно, при добавлении легенды patchwork центров соответствует требованиям gtable макета.

Одним из вариантов управления позиционированием или заполнением легенды может быть сжатие первого столбца через cowplot::gtable_squash_cols и, при желании, добавление отступов путем добавления нового столбца с желаемым количеством отступов через gtable::gtable_add_cols:

# Squash first column
p_legend <- cowplot::gtable_squash_cols(p_legend, 1)
# Add some padding by adding a new col
p_legend <- gtable::gtable_add_cols(p_legend, unit(.1, "cm"), pos = 1)

p_main <- p1 <- 
  ggplot(data=data, mapping=aes(x=county, y=Percent, fill=Variable)) +
  geom_col(show.legend = FALSE) + 
  scale_fill_manual(values = c("#CF232B","#942192","#000000"))

p_main + plot_spacer() + p_legend + 
  plot_layout(widths = c(12.5, 1.5, 4)) &
  theme(plot.margin = margin(),
        plot.background = element_rect(colour = "black"))

person stefan    schedule 09.04.2021
comment
это чудесно. Спасибо, Стефан. На самом деле, добавление отступов после сквоша для этой цели не требуется - p_legend <- gtable_squash_cols(get_legend(p1), 1) должно хватить - person tjebo; 11.04.2021
comment
Кстати, действительно умно. Я просто не думал исследовать лежащую в основе gtable до p_legend. Я почти собирался отправить запрос функции в лоскутном стиле. Спасибо, что спас меня от этого - person tjebo; 11.04.2021
comment
Привет @tjebo. Добро пожаловать. Это был очень интересный и полезный вопрос. И очень хорошая возможность глубже погрузиться в манипуляции с ggplot через gtable, cowplot, ... Best S. - person stefan; 11.04.2021