ggplot2:柱状图与折线图的统一图例配置问题
解决双Y轴图表的图例优化问题
你需要移除图例中的红色方块,并给蓝色方块添加边框,同时统一柱状图和折线图的图例标识。以下是修改后的可复现代码:
set.seed(123) # 设置随机种子保证结果可复现 df <- data.frame(value1 = runif(100, 0, 1), value2 = runif(100, 0, 100), weight = runif(100, 1, 5), group = rep(c("A","B","C","D","E"), 20)) df$value2 <- df$value2/100 ggplot(df) + aes(weight = weight) + # 柱状图:同时映射fill和color,便于控制图例边框 stat_weighted_mean(aes(x = group, y = value1, fill = "Value 1", color = "Value 1"), geom = "bar") + # 折线图:保留color映射 stat_weighted_mean(aes(x = group, y = value2, group = 1, color = "Value 2"), geom = "line") + # 点层:将color纳入映射,统一由scale控制样式 stat_weighted_mean(aes(x = group, y = value2, color = "Value 2"), geom = "point") + scale_y_continuous(sec.axis = sec_axis(~.x/100, name = "Value 2")) + labs(x = "分组", y = "Value 1") + # 配置fill的样式 scale_fill_manual(name = "图例", breaks = c("Value 1", "Value 2"), values = c("Value 1" = "#92C5DE", "Value 2" = NA)) + # 配置color的样式,同时覆盖图例显示 scale_color_manual(name = "图例", breaks = c("Value 1", "Value 2"), values = c("Value 1" = "#143a67", "Value 2" = "#D6604D"), guide = guide_legend(override.aes = list( shape = c(15, 16), # Value1用方块,Value2用圆点 linetype = c("blank", "solid"), # Value1无折线,Value2显示折线 fill = c("#92C5DE", NA) # Value1填充蓝色,Value2无填充 ))) + # 合并fill和color的图例,避免重复显示 guides(fill = guide_legend(override.aes = list(shape = 15, linetype = "blank")), color = guide_legend(override.aes = list(shape = c(15, 16), linetype = c("blank", "solid"))))
关键修改说明:
- 把柱状图的
fill和color都加入映射,实现蓝色方块带深色边框的效果; - 将点层的固定
color改为映射到"Value 2",消除图例中多余的红色方块; - 通过
guide_legend的override.aes参数,分别指定两个图例项的形状、折线样式和填充色,让图例与图表元素对应; - 合并
fill和color的图例,保证只显示一个统一的图例。
内容的提问来源于stack exchange,提问作者Antoine D
相关产品推荐
相关产品推荐

