如何在ggplot2中为geom_hline、geom_vline添加对应方向的独立图例
ggplot2分组折线图辅助线图例方向修正方案
核心原理
默认geom_hline、geom_vline使用通用的横向线段作为图例键,只需手动指定对应内置的图例键生成函数,即可实现水平线显示横向图例、垂直线显示纵向图例,搭配ggnewscale可灵活控制图例的合并与拆分。
准备工作
首先加载依赖包:
library(ggplot2) library(ggnewscale)
测试用基础数据:
# 分组折线测试数据 df <- data.frame( x = rep(1:5, 2), group = rep(c("对照组", "实验组"), each = 5), y = c(1:5, 2:6) )
实现方案1:辅助线图例完全独立拆分
主折线、水平线、垂直线各用独立图例,互不干扰:
ggplot(df, aes(x = x, y = y)) + # 基础分组折线(原有逻辑不变) geom_line(aes(color = group), linewidth = 1) + # 新建独立刻度给水平线使用 new_scale_color() + new_scale("linetype") + # 添加水平线,指定横向图例键 geom_hline( aes(yintercept = 3, color = "预警阈值", linetype = "预警阈值"), linewidth = 0.8, draw_key = draw_key_hline ) + geom_hline( aes(yintercept = 5, color = "最高阈值", linetype = "最高阈值"), linewidth = 0.8, draw_key = draw_key_hline ) + # 配置水平线图例样式 scale_color_manual(name = "水平辅助线", values = c("预警阈值" = "orange", "最高阈值" = "red")) + scale_linetype_manual(name = "水平辅助线", values = c("预警阈值" = "dashed", "最高阈值" = "dotted")) + # 再新建独立刻度给垂直线使用 new_scale_color() + new_scale("linetype") + # 添加垂直线,指定纵向图例键 geom_vline( aes(xintercept = 2, color = "起始节点", linetype = "起始节点"), linewidth = 0.8, draw_key = draw_key_vline ) + geom_vline( aes(xintercept = 4, color = "结束节点", linetype = "结束节点"), linewidth = 0.8, draw_key = draw_key_vline ) + # 配置垂直线图例样式 scale_color_manual(name = "垂直辅助线", values = c("起始节点" = "darkgreen", "结束节点" = "blue")) + scale_linetype_manual(name = "垂直辅助线", values = c("起始节点" = "dashed", "结束节点" = "dotted")) + theme_bw()
实现方案2:所有辅助线合并到同一图例
水平线、垂直线条目共用一个图例,各自保留对应线条方向:
ggplot(df, aes(x = x, y = y)) + # 基础分组折线(原有逻辑不变) geom_line(aes(color = group), linewidth = 1) + # 新建独立刻度给所有辅助线使用 new_scale_color() + new_scale("linetype") + # 添加水平线,指定横向图例键 geom_hline( aes(yintercept = 3, color = "预警阈值", linetype = "预警阈值"), linewidth = 0.8, draw_key = draw_key_hline ) + # 添加垂直线,指定纵向图例键 geom_vline( aes(xintercept = 4, color = "结束节点", linetype = "结束节点"), linewidth = 0.8, draw_key = draw_key_vline ) + # 统一配置辅助线图例,两类线会自动合并到同一图例 scale_color_manual( name = "辅助线", values = c("预警阈值" = "red", "结束节点" = "blue") ) + scale_linetype_manual( name = "辅助线", values = c("预警阈值" = "dashed", "结束节点" = "dotted") ) + theme_bw()
注意事项
- 辅助线的颜色、线型属性必须写在
aes()内部才会进入图例,写在aes()外仅修改样式不会生成图例 draw_key_hline、draw_key_vline为ggplot2 3.3.0及以上版本内置函数,低版本需手动定义对应图例生成函数- 若不需要拆分主折线与辅助线的颜色映射,可省略
new_scale_color()调用,直接在同一颜色刻度下配置不同分组的颜色即可
内容的提问来源于stack exchange,提问作者GoGonzo
相关产品推荐
相关产品推荐

