ggplot绘图:单变量三色展示仅保留一种图例项,移除NA图例
问题需求
- 变量
tei_tl需按规则显示黑、红、绿三种颜色:EU=1时为绿色,tei_tl<1时为红色,其余为黑色 - 图例仅保留
tei_tl对应的黑色(标注为"TEI")和Ann_av_te对应的蓝色(标注为"TEI annual averages") - 移除图例中无关的NA项
修改思路
- 将不需要生成图例的红、绿颜色直接通过
geom的color参数(而非aes(color))设置,避免这些颜色进入图例映射池 - 仅将需要在图例中展示的两个系列,通过
aes(color)指定分组名称,确保图例只生成这两个项 - 用
scale_color_manual精准绑定分组名称与对应颜色,同时设置图例标签
修改后的完整代码
# 加载依赖包 library(ggplot2) # 导入用户提供的数据 datateff <- structure(list(Company = c("Ryanair", "Ryanair", "Ryanair", "Ryanair", "Ryanair", "Ryanair", "Ryanair", "Ryanair", "Ryanair", "Ryanair", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines", "Singapore Airlines"), Year = c(2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021), tei_tl = c(0.79265, 0.8301, 0.90591, 0.89794, 0.92407, 0.91998, 1, 0.91571, 0.80457, 0.69001, 0.80559, 0.80162, 0.79714, 0.76219, 0.75193, 0.81753, 0.83193, 0.79027, 0.28713, 0.6495), EU = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Ann_av_te = c(0.77291, 0.80389, 0.83033, 0.81141, 0.79951, 0.8164, 0.83807, 0.81942, 0.56056, 0.66667, 0.77291, 0.80389, 0.83033, 0.81141, 0.79951, 0.8164, 0.83807, 0.81942, 0.56056, 0.66667)), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame")) # 绘图代码 ggplot(data = datateff) + # 绘制tei_tl线条:按条件设置颜色,不放入aes,不生成图例 geom_line(aes(x = Year, y = tei_tl, group = Company), color = ifelse(datateff$EU == 1, "green", ifelse(datateff$tei_tl < 1, "red", "black"))) + # 绘制tei_tl点:同样按条件设置颜色,不放入aes geom_point(aes(x = Year, y = tei_tl, group = Company), size = 1, color = ifelse(datateff$EU == 1, "green", ifelse(datateff$tei_tl < 1, "red", "black"))) + # 绘制Ann_av_te线条:放入aes(color)指定图例名称 geom_line(aes(x = Year, y = Ann_av_te, group = Company, color = "TEI annual averages")) + # 添加透明线条仅用于生成TEI的图例项(实际不显示) geom_line(aes(x = Year, y = tei_tl, group = Company, color = "TEI"), alpha = 0) + # 设置颜色映射:仅保留两个图例项,绑定对应颜色 scale_color_manual(name = "", values = c("TEI" = "black", "TEI annual averages" = "#33CCFF"), labels = c("TEI", "TEI annual averages")) + labs(x = "Year", y = "") + facet_wrap(~ Company, nrow = 5, ncol = 4) + theme(axis.text = element_text(size = 6), axis.title = element_text(size = 8), text = element_text(size = 8), legend.text = element_text(colour = "black", size = 6), legend.title = element_text(colour = "black", size = 6), legend.position = c(1.0, .01), legend.justification = c("right", "bottom"), legend.box.just = "right", legend.margin = margin(6, 6, 6, 6))
代码说明
- 把
tei_tl的线条和点的颜色从aes中移出,直接用ifelse条件赋值,红、绿颜色不会生成图例项 - 添加透明的
geom_line仅用于在aes(color)中注册"TEI"分组,确保它出现在图例中,实际不会在图中显示 scale_color_manual只定义两个分组的颜色,自动过滤无关的NA项,最终图例仅显示黑色(TEI)和蓝色(TEI annual averages)
内容的提问来源于stack exchange,提问作者Montacer
相关产品推荐
相关产品推荐

