使用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
相关产品推荐
相关产品推荐

