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

使用ggarrange组合带inset的ggplot图报错及替代方案咨询

解决方案:带Inset的图并排展示、共享图例及添加标注

针对你遇到的Error in plot$plot_env : $ operator is invalid for atomic vectors错误,以及patchwork对齐问题,这里提供两个可行方案,优先推荐cowplot(与你用的ggdraw兼容性更好):

方案1:使用cowplot包(推荐)

cowplot原生支持ggdraw生成的带inset的图,标注和图例处理更直观:

library(ggplot2)
library(cowplot)

# 1. 准备基础图(先移除自带图例,后续统一用共享图例)
p1 <- ggplot(mtcars, aes(wt, mpg, color = factor(cyl))) +
  geom_point() +
  theme(legend.position = "none")

# 2. 制作带inset的图
main_plot <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
  geom_point() +
  theme(legend.position = "none")
# 小inset图
inset_plot <- ggplot(iris, aes(Petal.Length)) +
  geom_histogram(bins = 10) +
  theme_minimal() +
  theme(plot.background = element_rect(fill = "white", color = NA))

# 组合主图和inset
p2 <- ggdraw() +
  draw_plot(main_plot) +
  draw_plot(inset_plot, x = 0.7, y = 0.6, width = 0.25, height = 0.25)

# 3. 提取共享图例(确保图例映射与两张图一致)
shared_legend <- get_legend(
  ggplot(mtcars, aes(wt, mpg, color = factor(cyl))) +
    geom_point() +
    theme(legend.box.margin = margin(0, 0, 0, 0))
)

# 4. 组合两张图并添加A/B标注
plot_row <- plot_grid(p1, p2, labels = c("A", "B"), label_size = 12, label_x = 0.05)

# 5. 组合图与共享图例
final_plot <- plot_grid(plot_row, shared_legend, rel_widths = c(3, 0.5))

print(final_plot)

关键说明:

  • plot_grid直接支持ggdraw对象,不会出现原子向量错误
  • labels参数一键添加左上角标注,label_x可调整标注位置
  • get_legend提取统一图例,最后按比例组合图和图例

方案2:使用patchwork包

如果坚持用patchwork,需确保子图都是有效gg对象,并统一主题边距解决对齐问题:

library(ggplot2)
library(patchwork)
library(cowplot)

# 1. 准备基础图
p1 <- ggplot(mtcars, aes(wt, mpg, color = factor(cyl))) +
  geom_point()

# 2. 制作带inset的图
main_plot <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color = Species)) +
  geom_point()
inset_plot <- ggplot(iris, aes(Petal.Length)) +
  geom_histogram(bins = 10) +
  theme_minimal() +
  theme(plot.background = element_rect(fill = "white", color = NA))

p2 <- ggdraw() +
  draw_plot(main_plot) +
  draw_plot(inset_plot, x = 0.7, y = 0.6, width = 0.25, height = 0.25)

# 3. 组合图:共享图例+添加标注
final_plot <- (p1 + p2) +
  plot_annotation(labels = c("A", "B"), tag_levels = "A", tag_position = "topleft") +
  plot_layout(guides = "collect") & # 收集共享图例
  theme(legend.position = "right", plot.margin = margin(10, 10, 10, 10)) # 统一边距解决对齐

print(final_plot)

错误排查:

你遇到的$ operator is invalid for atomic vectors,大概率是因为某张图不是有效的ggplot/gg对象——比如你可能直接赋值了draw_plot()的结果(返回原子向量),而非ggdraw() + draw_plot()生成的gg对象。检查你的代码,确保带inset的图是ggdraw返回的完整对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:29:51