R语言ggplot2如何隐藏部分图例条目仅保留折线图例
ggplot2 仅保留折线图例、隐藏散点图例实现方法
问题复现
当前使用的绘图代码如下:
ggplot() + geom_line(data=TS_SimHeads_HOBS_final, aes(x=as.Date(Date), y=BH2672), color='red') + geom_point(data=Hydro_dates_wellData_2014_2018, aes(x=as.Date(Date), y=BH2672), color='red') + geom_line(data=TS_SimHeads_HOBS_final, aes(x=as.Date(Date), y=BH3025), color='green') + geom_point(data=Hydro_dates_wellData_2014_2018, aes(x=as.Date(Date), y=BH3025), color='green') + xlab("Date") + ylab("Head") #theme_bw()
运行后输出效果:
需求为图例仅展示模拟数据对应的折线条目,隐藏实测散点对应的条目。
附测试样例数据(截取前6行):
| Date | BH2672 | BH278 | BH2978 | BH2987 | BH3025 | BH312 | BH3963 | BH3962 | BH3957 |
|---|---|---|---|---|---|---|---|---|---|
| 2014-02-19 | 31.28400 | 78.86755 | 5.671027 | 39.48419 | 53.60201 | 44.29516 | 69.23685 | 61.70843 | 56.13871 |
| 2014-02-20 | 30.76656 | 78.87344 | 5.656940 | 39.49012 | 53.56489 | 44.50679 | 69.50910 | 61.70638 | 56.09621 |
| 2014-02-21 | 30.43226 | 78.88097 | 5.642136 | 39.49902 | 53.56041 | 44.65761 | 69.65709 | 61.70126 | 56.04346 |
| 2014-02-22 | 30.16532 | 78.88979 | 5.643818 | 39.51101 | 53.56065 | 44.78333 | 69.75621 | 61.69643 | 55.99459 |
| 2014-02-23 | 29.93577 | 78.89954 | 5.650873 | 39.52544 | 53.55970 | 44.89429 | 69.82983 | 61.69332 | 55.95241 |
| 2014-02-24 | 29.73162 | 78.90991 | 5.658991 | 39.54147 | 53.55682 | 44.99520 | 69.88845 | 61.69236 | 55.91639 |
实现方案
方法1:最小改动适配原有代码
只需要两处调整即可实现需求:
- 在所有
geom_point()图层中添加参数show.legend = FALSE,直接屏蔽散点层的图例生成 - 将颜色分组映射移入
geom_line()的aes()内部,通过scale_color_manual指定对应颜色,保证图例正确匹配监测井
调整后代码如下:
ggplot() + geom_line(data=TS_SimHeads_HOBS_final, aes(x=as.Date(Date), y=BH2672, color = "BH2672")) + geom_point(data=Hydro_dates_wellData_2014_2018, aes(x=as.Date(Date), y=BH2672), color='red', show.legend = FALSE) + geom_line(data=TS_SimHeads_HOBS_final, aes(x=as.Date(Date), y=BH3025, color = "BH3025")) + geom_point(data=Hydro_dates_wellData_2014_2018, aes(x=as.Date(Date), y=BH3025), color='green', show.legend = FALSE) + scale_color_manual(name = "监测井", values = c("BH2672" = "red", "BH3025" = "green")) + xlab("Date") + ylab("Head") #theme_bw()
方法2:长格式规范写法(多监测井场景推荐)
如果后续需要添加更多监测井的绘图,逐图层写代码重复度太高,可以先将宽格式数据转为长格式,一次性完成映射,自动生成正确图例:
library(dplyr) library(tidyr) # 整理模拟数据为长格式 sim_data <- TS_SimHeads_HOBS_final %>% mutate(Date = as.Date(Date)) %>% pivot_longer(cols = starts_with("BH"), names_to = "well_id", values_to = "sim_head") # 整理实测数据为长格式 obs_data <- Hydro_dates_wellData_2014_2018 %>% mutate(Date = as.Date(Date)) %>% pivot_longer(cols = starts_with("BH"), names_to = "well_id", values_to = "obs_head") # 绘图 ggplot() + geom_line(data = sim_data, aes(x = Date, y = sim_head, color = well_id), linewidth = 0.8) + geom_point(data = obs_data, aes(x = Date, y = obs_head, color = well_id), size = 1.2, show.legend = FALSE) + # 自定义颜色,可根据监测井数量扩展 scale_color_manual(name = "模拟水位", values = c("BH2672" = "red", "BH3025" = "green")) + labs(x = "Date", y = "Head") #theme_bw()
上述两种方法最终输出的图例都只会保留模拟数据对应的折线条目,同个监测井的散点和折线颜色保持一致,不会出现散点对应的图例项。
内容的提问来源于stack exchange,提问作者ΚΩΝΣΤΑΝΤΙΝΟΣ ΠΑΝΑΓΙΩΤΟΥ
相关产品推荐
相关产品推荐

