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

ggplot2堆叠柱形图与折线图图例重复问题求助

解决ggplot2堆叠柱形图与折线图图例混杂问题

我明白你遇到的问题了——当同时使用fill(柱形图)和color(折线图)映射同一个变量名时,ggplot会把所有相关的变量都塞进同一个图例组里,导致折线的项出现在柱形图的图例中。下面是具体的解决方法和修改后的代码:

问题根源

你的代码中,柱形图用fill=variable,折线图用color=variable,且scale_fill_manual使用了包含所有变量的调色板,这就导致fill图例自动包含了折线图的变量项。我们需要把两个映射的图例分开,各自只显示对应图形的变量。

修改后的完整代码

##Remove Objects
rm(list=ls(all=TRUE))
##Load packages
library(ggplot2)
library(dplyr)
library(reshape)
##Data
set.seed(12345)
d.fig6.1 <- data.frame(mm=c("Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"),a.1=(rnorm(12)*5)^2)
d.fig6.1$a.2 <- (rnorm(12)*5)^2
d.fig6.1$a.3 <- (rnorm(12)*5)^2
d.fig6.1$a.4 <- (rnorm(12)*5)^2
d.fig6.1$a.5 <- (rnorm(12)*5)^2
d.fig6.1$a.6 <- (rnorm(12)*5)^2
d.fig6.1$a.7 <- (rnorm(12)*5)^2
d.fig6.2 <- data.frame(mm=c("Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"),a.8=(rnorm(12)*5)^2)
d.fig6.2$a.9 <- (rnorm(12)*5)^2
d.fig6.1 <- melt(d.fig6.1,id="mm")
d.fig6.2 <- melt(d.fig6.2,id="mm")

# 提取柱形图和折线图各自的变量列表
bar_vars <- unique(d.fig6.1$variable)
line_vars <- unique(d.fig6.2$variable)

##Plot
theme_set(theme_bw(7)) #25
cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7","red")
sp.6 <- ggplot(d.fig6.1, aes(x=mm, y=value, fill=variable)) + 
  geom_col() + 
  labs(x="", y="[Units]") + 
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        legend.title = element_blank()) + 
  # 仅为柱形图变量设置fill图例,排除折线图变量
  scale_fill_manual(values=cbPalette[1:length(bar_vars)], 
                    breaks=bar_vars) + 
  geom_text(aes(label = round(value,digits=2)), 
            position = position_stack(vjust=0.5), size=2) + 
  # 折线图使用color映射,独立设置图例
  geom_line(data=d.fig6.2, aes(x=as.numeric(mm), y=value, color=variable),
            size=1,inherit.aes = FALSE) + 
  # 调整折线文本位置,避免与柱形文本重叠
  geom_text(data=d.fig6.2, aes(x=as.numeric(mm), y=value, label=round(value,digits=2)),
            hjust=0.5, vjust=-0.5, size=2.5) + 
  # 为折线图变量单独设置color图例
  scale_color_manual(values=cbPalette[(length(bar_vars)+1):length(cbPalette)],
                     breaks=line_vars)
sp.6

关键改动说明

  1. 分离变量列表:提前提取柱形图(bar_vars)和折线图(line_vars)的变量,明确区分两类图形对应的图例项。
  2. 独立设置fill图例:在scale_fill_manual中通过breaks=bar_vars限制仅显示柱形图的变量,同时只使用调色板中对应数量的颜色。
  3. 新增color图例设置:用scale_color_manual专门为折线图的color映射设置颜色和图例项,确保折线的图例独立显示,不会混入柱形图的图例中。
  4. 优化文本位置:调整折线图文本的hjust和vjust,避免与柱形图的堆叠文本重叠,提升可读性。

这样修改后,柱形图的图例只会显示a.1到a.7,折线图的图例显示a.8和a.9,两者不再混杂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:16:59