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

使用patchwork时多次inset_element与plot_annotation冲突问题求助

问题描述

在使用patchwork合并子图时,多次用inset_element嵌入同一个子图,最后通过plot_annotation添加标签,出现第二次嵌入的图表缺失注释的问题。相关代码如下:

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('Plot 4')

p1n <- p1 + inset_element(
  p4,
  left = 0.05,
  bottom = 0.05,
  right = 0.25,
  top = 0.25,
  ignore_tag = TRUE)

p2n <- p2 + inset_element(
  p4,
  left = 0.05,
  bottom = 0.05,
  right = 0.25,
  top = 0.25,
  ignore_tag = TRUE)

patchwork <- (p1n + p2n) / p3
patchwork + plot_annotation(tag_levels = 'A')

问题原因

问题出在重复使用了同一个ggplot对象p4。当第一次用inset_element嵌入p4后,patchwork会修改这个对象的内部状态(标记它已被处理),第二次再嵌入同一个p4时,它的状态已不是初始状态,导致注释无法正常渲染。

解决方法

有两种简单的解决思路:

方法1:每次嵌入时使用独立的绘图对象

复制p4生成新实例,确保每次嵌入的是不同对象,避免状态复用:

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('Plot 4')
p4_copy <- p4 # 复制p4生成新对象

p1n <- p1 + inset_element(
  p4,
  left = 0.05,
  bottom = 0.05,
  right = 0.25,
  top = 0.25,
  ignore_tag = TRUE)

p2n <- p2 + inset_element(
  p4_copy, # 使用复制的独立对象
  left = 0.05,
  bottom = 0.05,
  right = 0.25,
  top = 0.25,
  ignore_tag = TRUE)

patchwork <- (p1n + p2n) / p3
patchwork + plot_annotation(tag_levels = 'A')

方法2:用wrap_elements包装子图

通过wrap_elements把p4包装成独立的patchwork组件,避免直接复用原对象:

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('Plot 4')

p1n <- p1 + inset_element(
  wrap_elements(p4), # 用wrap_elements包装子图
  left = 0.05,
  bottom = 0.05,
  right = 0.25,
  top = 0.25,
  ignore_tag = TRUE)

p2n <- p2 + inset_element(
  wrap_elements(p4), # 同样包装
  left = 0.05,
  bottom = 0.05,
  right = 0.25,
  top = 0.25,
  ignore_tag = TRUE)

patchwork <- (p1n + p2n) / p3
patchwork + plot_annotation(tag_levels = 'A')

修改后,两次嵌入的子图都能正常显示注释。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:15:01