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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:24:52