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

如何在Ridgeline图中为每个脊线添加专属垂直参考线?

梦幻棒球联赛赛程分析:为脊线图添加球队专属胜场垂直线

我正在分析梦幻棒球联赛的赛程影响,通过让每支球队使用其他所有球队的赛程模拟比赛,来判断赛程差异以及哪些球队因赛程获得“运气”优势。使用ggplot2的geom_density_ridges绘制胜场数的脊线图后,我需要给每支球队对应的脊线添加专属垂直参考线——只标记该球队的实际胜场数,且这条线不能贯穿整个图表、不干扰其他脊线的视觉呈现。

我尝试过以下方法但均未达到预期:

  • 添加实际胜场的标记点(仅显示点,无对应垂直线)
  • 使用geom_vline添加垂直线(线条会贯穿整个图表)
  • 用facet_wrap拆分图表(脊线位置适配错误,无实际帮助)
  • 添加均值/四分位数线(并非目标的实际胜场标记线)

解决方案

核心思路

要实现每个脊线单独的垂直线,关键在于:

  1. 提取每个球队唯一的实际胜场数据,避免重复绘制
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:06:18