控制添加到拼凑中的 grobs 的填充
Control padding of grobs added to patchwork
这是 的后续问题。 OP 要求以特定距离安排部分地块的方法。我觉得teunbrand回答的很好
我自己的建议(用 cowplot 提取图例,并将它们按所需比例拼接成图)并不完全令人满意,因为它在给定示例中只是“偶然”起作用 - 图例标签足够长将图例 grob 居中放置在第三个绘图的视口中。
标签较短揭示了问题 - 添加 grob 时,拼凑使这个 grob 居中,基本上向所有边均匀填充。
我的问题是,您知道控制这种填充行为的方法吗?
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"))
不太理想的结果 - 图例 grob(灰色背景)应与左图边框(黑线)对齐
由 reprex package (v1.0.0)
于 2021-04-09 创建
据我所知,问题不在 patchwork
一方。看一下图例 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
压缩第一列,如果需要,通过添加具有所需填充量的新列通过 [= 添加一些填充17=]:
# 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"))
这是
我自己的建议(用 cowplot 提取图例,并将它们按所需比例拼接成图)并不完全令人满意,因为它在给定示例中只是“偶然”起作用 - 图例标签足够长将图例 grob 居中放置在第三个绘图的视口中。
标签较短揭示了问题 - 添加 grob 时,拼凑使这个 grob 居中,基本上向所有边均匀填充。
我的问题是,您知道控制这种填充行为的方法吗?
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"))
不太理想的结果 - 图例 grob(灰色背景)应与左图边框(黑线)对齐
由 reprex package (v1.0.0)
于 2021-04-09 创建据我所知,问题不在 patchwork
一方。看一下图例 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
压缩第一列,如果需要,通过添加具有所需填充量的新列通过 [= 添加一些填充17=]:
# 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"))