解决ggplot2中无数据分类变量图例颜色缺失问题
解决geom_area图例显示未包含分类并设置对应颜色的问题
需求说明
绘制geom_area图,要求图例同时展示A、B、C三种处理的对应颜色,但实际数据集仅包含A、B两类数据。使用scale_fill_manual的limits参数添加C后,C的图例显示为空白灰色,需改为红色;同时要实现多图共享图例,且不修改原数据框。
原始代码
加载包
library(ggplot2)
数据集
df = data.frame( treatment = rep(c("A", "B"), 3), year = rep(c(2000, 2010, 2020), each=2), measurement = c(0.5, 0.5, 0.6, 0.7, 0.6, 0.8) )
初始绘图脚本
legend.values = c("blue", "green", "red") legend.limits = c("A", "B", "C") names(legend.values) = legend.limits plot = ggplot(data=df) + geom_area(aes(y=measurement, x=year, fill=treatment)) + scale_fill_manual(values=legend.values, limits=legend.limits)
解决方案
问题根源在于原始数据的treatment仅包含A、B两个取值,ggplot默认只识别这两个类别,导致C无法匹配到指定颜色。只需在aes()中将treatment转换为包含所有目标图例项的因子,即可让ggplot正确映射颜色:
修改后的绘图代码
legend.values = c("blue", "green", "red") legend.limits = c("A", "B", "C") names(legend.values) = legend.limits plot = ggplot(data=df) + # 将treatment转换为包含全部目标水平的因子 geom_area(aes(y=measurement, x=year, fill=factor(treatment, levels=legend.limits))) + scale_fill_manual(values=legend.values, limits=legend.limits, name="处理")
多图共享图例实现
使用patchwork包可以轻松实现多图共享图例,无需重复设置:
library(patchwork) # 示例第二个图形 df2 = df[df$treatment == "A", ] plot2 = ggplot(data=df2) + geom_area(aes(y=measurement, x=year, fill=factor(treatment, levels=legend.limits))) + scale_fill_manual(values=legend.values, limits=legend.limits, name="处理") # 拼接图形并共享图例 (plot + plot2) + plot_layout(guides = "collect")
内容的提问来源于stack exchange,提问作者zackelaz
相关产品推荐
相关产品推荐

