为何用patchwork的guide_area()无法将图例移至空白区域?
问题:将patchwork布局的图例移至下方子图右侧空白区
我用patchwork包布局可视化,第一行是占满整行的plot_1,下方是尺寸稍小的plot_2,二者共用图例。现在想把图例移到plot_2右侧的空白区域,而不是整个布局的右侧。我尝试加入guide_area()但没效果,想知道方法失效的原因,以及正确的实现方式。
原代码
plot_1/(plot_2+guide_area()+plot_layout(widths = c(1.3, 1)))+ plot_layout(guides = 'collect')+ plot_annotation(title = 'title', subtitle = 'subtitle', tag_levels = 'A',tag_suffix = ')', theme=theme(plot.title = element_text(size = 20,face='bold'), plot.subtitle = element_text(size = 20))) & theme(plot.tag = element_text(size = 15,face='bold'))
当前布局问题示意图

失效原因
你当前代码里,外层的plot_layout(guides = 'collect')优先级高于内层的guide_area()设置。guides='collect'会强制把所有图例收集到整个布局的右侧,完全忽略了你在下层布局中为plot_2搭配的guide_area(),这就是为什么你的尝试没效果。
解决方法
要让图例精准放到plot_2右侧,需要调整布局逻辑,让图例收集的作用范围限定在下层布局中,而不是全局。这里提供两种可行写法:
写法一:保留guide_area,调整全局布局设置
(plot_1 / (plot_2 + guide_area() + plot_layout(widths = c(1.3, 1)))) + plot_layout(guides = "keep") + # 关键:用keep替代collect,保留内层布局的图例设置 plot_annotation(title = 'title', subtitle = 'subtitle', tag_levels = 'A',tag_suffix = ')', theme=theme(plot.title = element_text(size = 20,face='bold'), plot.subtitle = element_text(size = 20))) & theme(plot.tag = element_text(size = 15,face='bold')) & theme(legend.position = "none") # 隐藏子图自带的图例,避免重复
写法二:直接提取图例与plot_2组合
这种方式更直观,手动提取图例后和plot_2放在同一行:
# 先移除两个子图的图例 plot_1_no_legend <- plot_1 + theme(legend.position = "none") plot_2_no_legend <- plot_2 + theme(legend.position = "none") # 组合布局:第一行plot_1,第二行plot_2 + 图例 plot_1_no_legend / (plot_2_no_legend + get_legend(plot_1) + plot_layout(widths = c(1.3, 1))) + plot_annotation(title = 'title', subtitle = 'subtitle', tag_levels = 'A',tag_suffix = ')', theme=theme(plot.title = element_text(size = 20,face='bold'), plot.subtitle = element_text(size = 20))) & theme(plot.tag = element_text(size = 15,face='bold'))
内容的提问来源于stack exchange,提问作者Kathrin Loosli
相关产品推荐
相关产品推荐

