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

技术求助:如何在ggplot中添加两个相同图例并修改其标题与标签

解决ggplot中添加两个相同图例并修改标题标签的问题

我明白你的需求:想要在图中显示两个完全相同的图例(分别对应color和fill映射),同时自定义图例的标题和标签。你的原始代码只显示了一个图例,这是因为ggplot默认会将映射到同一变量的color和fill图例合并,避免重复。下面是具体的解决方法:

问题分析

当aes()中的color和fill绑定同一个变量(这里是factor(dose))时,ggplot会自动合并两个图例,只保留一个。要强制显示两个独立但内容相同的图例,需要分别为color和fill设置独立的比例尺,并明确指定生成各自的图例。

修改后的代码

library(ggplot2)

ggplot(ToothGrowth, aes(x = len, color = factor(dose), fill = factor(dose))) +
  geom_density(alpha = 0.4) +
  # 保留你原来的主题设置,仅新增图例布局相关参数
  theme(
    panel.background = element_rect(fill = "khaki1", colour = "darkorchid3", size = 2, linetype = "solid"),
    panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "white"),
    panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "white"),
    plot.background = element_rect(fill = "bisque2"),
    text = element_text(colour = "blue4"),
    axis.title = element_text(size = rel(1.25)),
    axis.text = element_text(colour = "blue4", size = 12),
    legend.position = c(.85, .75),  # 微调位置避免两个图例重叠
    legend.background = element_rect(fill = "lightsalmon", colour = "tomato3", size = 1.25),
    legend.title = element_text(colour = "navy", face = "bold"),
    legend.text = element_text(colour = "midnightblue", face = "bold"),
    strip.background = element_rect(fill = "olivedrab1", colour = "darkorchid3", size = 2, linetype = "solid"),
    strip.text = element_text(colour = "coral4", size = 12, angle = 0, face = "bold"),
    legend.box = "vertical"  # 设置两个图例垂直排列,可选"horizontal"改为水平排列
  ) +
  # 为fill设置图例标题和标签,强制生成独立图例
  scale_fill_discrete(name = "Dose", labels = c("A", "B", "C"), guide = guide_legend()) +
  # 为color设置完全相同的标题和标签,强制生成独立图例
  scale_color_discrete(name = "Dose", labels = c("A", "B", "C"), guide = guide_legend()) +
  facet_wrap(~supp)

关键修改点

  1. 分别设置color和fill的比例尺:同时添加scale_fill_discrete和scale_color_discrete,两者的name和labels保持一致,确保两个图例内容完全相同。
  2. 强制生成独立图例:通过guide = guide_legend()参数,告诉ggplot不要合并这两个图例,而是分别显示。
  3. 调整图例布局:新增legend.box = "vertical"控制两个图例的排列方向,同时微调legend.position的坐标,避免图例重叠或超出绘图区域。

如果后续需要让两个图例的标题不同,只需要修改其中一个比例尺的name参数即可。

内容的提问来源于stack exchange,提问作者Baltazár Tivadar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:47