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

如何在ggplot中实现图例部分内外分置并设置内部图例透明背景?

拆分ggplot图例:部分内部、部分外部并设置透明背景

你遇到的问题其实可以通过拆分图例到不同绘图对象,再分别调整主题来解决——核心是先把要放在内部的图例单独提取出来,然后修改它的背景为透明,再用patchwork嵌入主图。下面是针对你的代码的具体解决方案:

步骤1:构建基础绘图对象

先把你的基础绘图逻辑抽出来,避免重复编写代码:

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

# 假设你的数据和分组变量已提前定义(如tot_grp, grp_n, grp)
base_plot <- ggplot() +
  geom_point(data = tot_grp, 
             aes(x = soc_wat_m, y = obs_m, 
                 size = factor(n_group, levels = grp_n), 
                 fill = factor(group, levels = grp)), 
             pch = 24) +
  geom_point(data = tot_grp, 
             aes(x = soc_m, y = obs_m, 
                 size = factor(n_group, levels = grp_n), 
                 fill = factor(group, levels = grp)), 
             pch = 21) +
  scale_fill_brewer(name = expression(paste("Classes [",m^-2,"·",yr^-58,"]")), 
                    palette = "PuOr") +
  scale_size_manual(name = "N per class", 
                    values = c(1, 2, 3, 4, 5, 6, 7)) +
  labs(x = expression(paste("SOC [kg·",m^-2, "]")), 
       y = expression(paste("SOC [kg·",m^-2, "]"))) +
  coord_equal() +
  theme_bw()

步骤2:创建带外部图例的主图

这里我们保留要放在外部的图例(比如fill图例),隐藏后续要放到内部的size图例:

main_plot <- base_plot +
  guides(
    fill = guide_legend(override.aes = list(shape = 21, size = 5), order = 2),
    # 隐藏size图例,后续将其嵌入绘图内部
    size = "none"
  ) +
  theme(legend.position = "right")

步骤3:提取并修改内部图例(设置透明背景)

创建一个只显示size图例的临时图,提取它的图例后,通过主题设置让背景透明:

# 临时图:仅显示size图例,隐藏fill图例
temp_size_plot <- base_plot +
  guides(
    fill = "none",
    size = guide_legend(override.aes = list(shape = 21), order = 3)
  )

# 提取图例并设置透明背景
inner_legend <- get_legend(temp_size_plot) +
  theme(
    legend.background = element_rect(fill = "transparent"),
    # 可选:如果需要每个图例符号的背景也透明,添加下面这行
    # legend.key = element_rect(fill = "transparent")
  )

步骤4:组合主图和内部图例

用patchwork的inset_element()把透明的内部图例嵌入主图的指定位置:

final_plot <- main_plot +
  inset_element(
    p = inner_legend,
    right = 0.5, 
    top = 0.55, 
    left = 0.95, 
    bottom = 0.95, 
    clip = TRUE
  )

# 查看最终绘图结果
print(final_plot)

关键说明

  • 如果想调换内部/外部的图例(比如把fill放在内部,size放在外部),只需要在main_plot和temp_size_plot中调换guides()里的显示/隐藏设置即可。
  • 你可以调整inset_element()的right/top/left/bottom参数,精确控制内部图例在绘图区域的位置。

内容的提问来源于stack exchange,提问作者Anna Juřicová

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:57:46