如何在Ridgeline图中为每个脊线添加专属垂直参考线?
梦幻棒球联赛赛程分析:为脊线图添加球队专属胜场垂直线
我正在分析梦幻棒球联赛的赛程影响,通过让每支球队使用其他所有球队的赛程模拟比赛,来判断赛程差异以及哪些球队因赛程获得“运气”优势。使用ggplot2的geom_density_ridges绘制胜场数的脊线图后,我需要给每支球队对应的脊线添加专属垂直参考线——只标记该球队的实际胜场数,且这条线不能贯穿整个图表、不干扰其他脊线的视觉呈现。
我尝试过以下方法但均未达到预期:
- 添加实际胜场的标记点(仅显示点,无对应垂直线)
- 使用
geom_vline添加垂直线(线条会贯穿整个图表) - 用
facet_wrap拆分图表(脊线位置适配错误,无实际帮助) - 添加均值/四分位数线(并非目标的实际胜场标记线)
解决方案
核心思路
要实现每个脊线单独的垂直线,关键在于:
- 提取每个球队唯一的实际胜场数据,避免重复绘制
- 使用
geom_segment替代geom_vline,通过控制垂直方向的范围,让线条仅出现在对应球队的脊线区域内
完整代码
library(ggplot2) library(ggridges) library(dplyr) # 从原始数据中提取每个球队的唯一实际胜场数据 actual_wins <- BoxPlotData %>% distinct(Team, .keep_all = TRUE) %>% select(Team, ActualWin = W.x) # 绘制脊线图并添加专属垂直线 ggplot(BoxPlotData, aes(x = WinTotal, y = Team, fill = Team)) + geom_density_ridges(scale = 1) + # 绘制仅对应当前球队的垂直线,控制y范围避免贯穿 geom_segment(data = actual_wins, aes(x = ActualWin, xend = ActualWin, y = as.numeric(Team) - 0.4, yend = as.numeric(Team) + 0.4), color = "black", linetype = "dashed", size = 1) + # 添加实际胜场的标记点 geom_point(data = actual_wins, aes(x = ActualWin, y = Team), shape = 18, size = 4, color = "black") + theme_ridges() + theme(legend.position = "none")
代码说明
distinct(Team, .keep_all = TRUE):确保每个球队仅保留一行数据,避免重复绘制相同的垂直线as.numeric(Team) - 0.4与yend = as.numeric(Team) + 0.4:将因子类型的Team转换为数值后,每个球队对应一个整数,通过加减0.4让垂直线刚好覆盖当前脊线的垂直范围,不会延伸到其他球队区域- 用黑色虚线样式的垂直线与彩色脊线形成对比,提升可读性
内容的提问来源于stack exchange,提问作者Clifford Applegarth
相关产品推荐
相关产品推荐

