ggplot按其他列数值分多类别设置点线颜色及10+分类不显示问题
问题原因
- 折线的颜色逻辑限制:
geom_line绘制的线段颜色默认取线段起点所属的分组颜色。如果属于10+分组的观测在时间序列上是孤立点,没有连续两个相邻的观测都属于10+分组,就不会出现对应颜色的线段,自然也不会触发图例显示该分类。 - 因子水平未显式定义:你直接对数值型的group列转因子,R会自动根据数据中实际出现的值生成因子水平,即使你在
scale_color_manual里设置了10个标签,只要数据中没有产生可见的10分组绘图元素,该分类就会被自动丢弃。 - 冗余图层问题:代码中重复调用了两次
geom_line,无意义的重复可能导致图层覆盖,隐藏部分颜色的显示。
解决方案
按如下方式修改代码即可:
- 生成group列时直接定义为因子,显式指定所有10个水平,避免自动生成水平的问题
- 在
scale_color_manual中添加drop = FALSE参数,强制显示所有分类的图例 - 可额外添加散点图层,让孤立的10+分组观测也能显示对应颜色
修改后的完整代码如下:
All_Hourly_1 %>% mutate(group = factor( case_when( max_AQHI < 2 ~ 1, max_AQHI < 3 ~ 2, max_AQHI < 4 ~ 3, max_AQHI < 5 ~ 4, max_AQHI < 6 ~ 5, max_AQHI < 7 ~ 6, max_AQHI < 8 ~ 7, max_AQHI < 9 ~ 8, max_AQHI < 10 ~ 9, TRUE ~ 10 ), levels = 1:10 )) %>% ggplot(aes(x = date, y = PM_RAMP, color = group, group = 1)) + geom_line(size = 1) + # 可选:添加散点显示孤立点的颜色 geom_point(size = 2) + scale_color_manual( values = c("deepskyblue1", "dodgerblue", "dodgerblue4", "yellow", "gold", "goldenrod", "lightcoral","red", "red3", "red4"), labels = c("1 (低风险)","2 (低风险)","3 (低风险)","4 (中风险)","5 (中风险)","6 (中风险)","7 (高风险)","8 (高风险)","9 (高风险)","10+ (极高风险)"), drop = FALSE ) + labs( colour = "空气质量健康指数值", x = "日期", y = expression(PM[2.5]~" (µg "~m^-3~")") )
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

