R语言ggplot2:柱状图叠加折线/点图的图例与颜色配置问题
解决ggplot2图表的图例与颜色配置问题
我来帮你搞定这个图表的两个核心问题:图例冗余异常和颜色不生效。咱们先梳理问题根源,再给出调整后的完整代码。
问题分析
- 颜色失效原因:你用了
scale_fill_manual但只控制了柱状图的fill美学,而折线和点用的是color美学,需要单独用scale_color_manual配置;另外你的geom_point里误写了color = quality(数据框里没有这个列),这会导致点图无法正确映射颜色。 - 图例冗余原因:当前
fill(柱状图)和color(折线/点)是两个独立的图例,且你给scale_fill_manual的labels包含了5个条目,但实际上fill只有total一个变量,导致图例混乱。
调整后的完整代码
# 定义数据 vol_reshape <- data.frame( date = c("2018-01-01", "2018-02-01", "2018-03-01", "2018-04-01"), variable = rep("total", 4), value = as.integer(c("8029", "8164", "9536", "9482")) ) qua_reshape <- data.frame( date = rep(c("2018-01-01", "2018-02-01", "2018-03-01", "2018-04-01"), 4), variable = c(rep("quality_1", 4), rep("quality_2", 4), rep("quality_3", 4), rep("pod", 4)), value = as.double(c("0.26", "0.26", "0.30", "0.32", "0.27", "0.27", "0.30", "0.32", "0.45", "0.42", "0.51", "0.55", "0.05", "0.04", "0.05", "0.05")) ) # 定义颜色和标签(分开对应fill和color) fill_cols <- c("total" = "#3D8BDA") fill_labs <- c("总容量") color_cols <- c( "quality_1" = "#000000", "quality_2" ="#000000", "quality_3" = "#000000", "pod" = "#ff8142" ) color_labs <- c( "Détectée automatique", "Détectée automatique ou déclarée par le conducteur", "Détectée automatique, déclarée par le conducteur ou par l'exploitant", "Rémontée POD" ) # 假设你已经定义了size列表,如果没有可以替换为具体数值比如size$label=3, size$line=1 size <- list(label=3, line=1, title=14, subtitle=12) # 绘制图表 p <- ggplot(data = vol_reshape[vol_reshape$value > 0,], aes(x = date, y = value, label = value, fill = variable)) + # 柱状图 geom_bar(stat = "identity", position = "stack", show.legend = TRUE) + geom_text(size = size$label, position = position_stack(vjust = 0.9), color = "#FFFFFF") + # 折线和点图(修正color映射为variable) geom_point(data = qua_reshape, aes(x = date, y = value * max(vol_reshape$value), color = variable)) + geom_line(data = qua_reshape, aes(x = date, y = value * max(vol_reshape$value), color = variable), size = size$line) + geom_text(data = qua_reshape, aes(x = date, y = value * max(vol_reshape$value), label = paste0(100*value, '%'), color = variable), size = size$label, vjust = -0.9, hjust = 1.5) + # 主题设置 theme_classic() + theme( legend.title = element_blank(), legend.position = "right", plot.title = element_text(hjust = 0.5, size = size$title, family="Proxima Nova"), plot.subtitle = element_text(size = size$subtitle, family="Proxima Nova"), axis.title.x = element_blank(), axis.text.x = element_text(angle = 45, margin=margin(t = 8), family="Proxima Nova") ) + # 双Y轴设置(添加右侧轴标题更清晰) scale_y_continuous(sec.axis = sec_axis(trans = ~ . * (1/max(vol_reshape$value)), name = "比例")) + # 分别配置fill和color的颜色与标签 scale_fill_manual(values = fill_cols, labels = fill_labs, drop = TRUE) + scale_color_manual(values = color_cols, labels = color_labs, drop = TRUE) print(p)
关键调整说明
- 修正语法错误:把
geom_point中的color = quality改为color = variable,确保点图能正确映射数据。 - 分开配置颜色:用
scale_fill_manual单独控制柱状图的蓝色,scale_color_manual控制折线/点的颜色(quality_1-3为黑色,pod为橙色)。 - 优化图例:两个图例分别对应柱状图(显示“总容量”)和折线/点(显示四个类别),避免冗余;通过
legend.title = element_blank()去掉图例标题,保持简洁。 - 简化代码:合并重复的
theme设置,让代码更整洁;给右侧Y轴添加标题,提升图表可读性。
内容的提问来源于stack exchange,提问作者Makoto Miyazaki
相关产品推荐
相关产品推荐

