You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

patchwork合并子图时图例位置控制及多层嵌套异常技术问询

问题1:patchwork拼接面板时忽略legend.box.spacing参数,如何兼顾面板对齐与子图图例位置设置

使用patchwork拼接两个ggplot子图时,子图中设置的legend.box.spacing参数会被忽略:

library(ggplot2)

p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point(aes(colour = factor(cyl)))


p1 <- p + geom_point(aes(colour = cyl))+
  theme(legend.box.spacing = unit(20, 'pt'))

p2 <- p + geom_point(aes(colour = cyl*100))+
  theme(legend.box.spacing = unit(20, 'pt'))

patchwork::wrap_plots(p1, p2, ncol = 1)

尝试过以下方法,但都无法满足需求:

  • 使用free()参数:能让两图整体宽度对齐,图例和面板遵循各自设置,但面板本身无法对齐
    patchwork::wrap_plots(free(p1), free(p2), ncol = 1)
    
  • 使用guides='collect':结果接近预期,但图例无法与对应子图对齐
    patchwork::wrap_plots(p1, p2, ncol = 1, guides = 'collect')
    

请问是否存在方法,既能让子图的面板对齐,又能确保每个子图的图例固定在其自身面板的指定位置?


编辑1:多层wrap_plots嵌套时主题设置失效问题

实际使用多栅格数据拼接时,多层嵌套wrap_plots会出现对齐异常,是否应该避免多次使用wrap_plots?

复现代码如下:

library(ggplot2)
library(terra)
library(tidyterra)
library(patchwork)
# 栅格数据
r1 <- rast(nrow = 10, ncol = 10)
values(r1) <- 1:ncell(r1)
r2 <- r1 * r1

rr <- c(r1, r2) |>
  `names<-`(c("r1", "r2"))

p1 <- ggplot() +
  geom_spatraster(data = rr) +
  facet_wrap(~lyr)

p2 <- ggplot() +
  geom_spatraster(data = r1) +
  facet_wrap(~lyr)

p3 <- ggplot() +
  geom_spatraster(data = rr / 10) +
  facet_wrap(~lyr)

p4 <- ggplot() +
  geom_spatraster(data = r2) +
  facet_wrap(~lyr)

design = 'aab
          ccd'

# 直接合并时正常,图例左对齐符合预期
patchwork::wrap_plots(p1, p2, p3, p4, ncol = 2, design = design) &
  theme(
    legend.box.background = element_rect(color = 'red'),
    legend.justification = 'left'
  )

但多层嵌套后,即使使用&而非*,主题设置也无法作用于所有子图:

sub1 <- wrap_plots(p1, p2, design = 'aab')
sub2 <- wrap_plots(p3, p4, design = 'aab')

wrap_plots(sub1, sub2, ncol = 1) &
  theme(
    legend.box.background = element_rect(color = 'blue'),
    legend.justification = 'left'
  )

内容的提问来源于stack exchange,提问作者Breeze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:52:41