ggplot中scale_fill_manual生成图例额外增加变量问题咨询
图例多出多余条目问题原因及解决方案
问题原因
- 你手动定义的颜色命名向量
energy.colours存在重复键:先后两次给Biometan赋值,R中命名向量本身支持重复键名,旧版本ggplot2处理手动标度时会自动对重复键名去重,仅保留最后一次赋值的条目;而v3.4.0及之后版本的ggplot2优化了标度匹配逻辑,不会自动合并重复键名,会将所有命名条目都纳入候选图例条目。 - 颜色向量中包含了数据集未出现的类别对应的配色:你设置了
Biogas、Biomass、System三类的配色为白色,若你的数据集energy列不存在这三个取值,旧版本scale_fill_manual默认自动丢弃未出现在数据中的分类,新版ggplot2的默认逻辑改为优先以values参数的命名作为分类依据,未出现在数据中的分类也会默认展示在图例中。
解决方案
- 首先清理颜色向量的重复键,删除重复的
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" )
- 调整
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
相关产品推荐
相关产品推荐

