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
关键改动说明
- 分离变量列表:提前提取柱形图(
bar_vars)和折线图(line_vars)的变量,明确区分两类图形对应的图例项。 - 独立设置fill图例:在
scale_fill_manual中通过breaks=bar_vars限制仅显示柱形图的变量,同时只使用调色板中对应数量的颜色。 - 新增color图例设置:用
scale_color_manual专门为折线图的color映射设置颜色和图例项,确保折线的图例独立显示,不会混入柱形图的图例中。 - 优化文本位置:调整折线图文本的
hjust和vjust,避免与柱形图的堆叠文本重叠,提升可读性。
这样修改后,柱形图的图例只会显示a.1到a.7,折线图的图例显示a.8和a.9,两者不再混杂。
内容的提问来源于stack exchange,提问作者Nuno
相关产品推荐
相关产品推荐

