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

R语言ggplot2:柱状图叠加折线/点图的图例与颜色配置问题

解决ggplot2图表的图例与颜色配置问题

我来帮你搞定这个图表的两个核心问题:图例冗余异常和颜色不生效。咱们先梳理问题根源,再给出调整后的完整代码。

问题分析

  1. 颜色失效原因:你用了scale_fill_manual但只控制了柱状图的fill美学,而折线和点用的是color美学,需要单独用scale_color_manual配置;另外你的geom_point里误写了color = quality(数据框里没有这个列),这会导致点图无法正确映射颜色。
  2. 图例冗余原因:当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:16