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

ggplot中scale_fill_manual生成图例额外增加变量问题咨询

图例多出多余条目问题原因及解决方案

问题原因

  • 你手动定义的颜色命名向量energy.colours存在重复键:先后两次给Biometan赋值,R中命名向量本身支持重复键名,旧版本ggplot2处理手动标度时会自动对重复键名去重,仅保留最后一次赋值的条目;而v3.4.0及之后版本的ggplot2优化了标度匹配逻辑,不会自动合并重复键名,会将所有命名条目都纳入候选图例条目。
  • 颜色向量中包含了数据集未出现的类别对应的配色:你设置了Biogas、Biomass、System三类的配色为白色,若你的数据集energy列不存在这三个取值,旧版本scale_fill_manual默认自动丢弃未出现在数据中的分类,新版ggplot2的默认逻辑改为优先以values参数的命名作为分类依据,未出现在数据中的分类也会默认展示在图例中。

解决方案

  1. 首先清理颜色向量的重复键,删除重复的Biometan定义,仅保留你需要的配色版本:
energy.colours <- c(
  Wind= "bisque3",
  Sole= "yellow3",
  Electricity=  "aquamarine3",
  Hydrogen= "cadetblue4",
  HydrogenCom=  "springgreen4",
  Methanol=  "goldenrod3",
  CO2 =  "grey50",
  Heat = "firebrick4", 
  Water="royalblue3",
  Biometan ="white", 
  Biogas="white",
  Biomass="white",
  System="white",
  Oxygen = "purple"
)
  1. 调整scale_fill_manual参数,显式控制展示的图例条目:
  • 方案A:添加drop=TRUE参数,自动丢弃数据中不存在的分类
ggplot( aes(fill=energy, y=value, x=time)) + 
      geom_bar(position="stack", stat="identity") +
      ggtitle(title) +
      theme_gppr()+
      scale_fill_manual(values=energy.colours, drop=TRUE)+
      xlab("Hours")+
      geom_hline(yintercept=0, linetype="dashed", color = "black", size=1)+
      ylab("MW")
  • 方案B:显式指定limits参数为数据集实际存在的energy取值,可控性更强(假设你的数据集名为df)
ggplot( aes(fill=energy, y=value, x=time)) + 
      geom_bar(position="stack", stat="identity") +
      ggtitle(title) +
      theme_gppr()+
      scale_fill_manual(values=energy.colours, limits = unique(df$energy))+
      xlab("Hours")+
      geom_hline(yintercept=0, linetype="dashed", color = "black", size=1)+
      ylab("MW")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:48:04