导入多份垒球统计CSV文件绘制球员BattingAVG与OBP周度变化轨迹
垒球球员赛季击球率与上垒率周度变化轨迹实现方案
第一步:批量导入所有周次CSV并合并为全量数据集
核心逻辑为匹配指定规则的文件名批量读取文件,自动为每一份数据增加周次标识后合并,复用原有清洗逻辑统一处理所有数据:
library(tidyverse) library(ggrepel) # 匹配当前工作目录下所有符合命名规则的周统计CSV文件 file_list <- list.files(pattern = "^teamstats_week\\d+\\.csv$") # 批量读取、清洗、合并所有周次数据 all_week_data <- map_dfr(file_list, function(file_path) { # 从文件名提取周次数字 week_num <- as.integer(str_extract(file_path, "\\d+")) # 读取单周原始数据 week_raw <- read.csv(file_path, skip = 1, stringsAsFactors = FALSE) # 清洗数据并新增周次字段 cleaned_data <- week_raw %>% mutate( Week = week_num, BattingAVG = as.double(AVG) * 1000, OnBasePercentage = as.double(OBP) * 1000, GamesPlayed = as.numeric(GP), PlayerNumber = as.integer(Number) ) %>% select(Week, PlayerNumber, First, GamesPlayed, BattingAVG, OnBasePercentage) %>% filter(PlayerNumber < 100, GamesPlayed > 6) return(cleaned_data) })
第二步:绘制带变动轨迹的关联散点图
核心逻辑为按球员分组,用带箭头的路径连接同一名球员不同周次的点位,直观体现指标变动方向,仅在最新周次标注姓名避免图表混乱:
ggplot(all_week_data, aes(x = BattingAVG, y = OnBasePercentage, group = PlayerNumber)) + # 绘制球员周度变化轨迹,箭头指向最新周次 geom_path( aes(color = as.factor(PlayerNumber)), arrow = arrow(type = "closed", length = unit(0.1, "inches")), linewidth = 0.8, alpha = 0.7 ) + # 绘制散点,周次越新点位越大 geom_point(aes(size = Week, color = as.factor(PlayerNumber)), alpha = 0.8) + # 仅在最新周次点位旁标注球员姓名 geom_text_repel( data = filter(all_week_data, Week == max(Week)), aes(label = First), size = 3, color = "black", max.overlaps = 20 ) + # 图表信息优化 labs( x = "击球率 (Batting AVG, *1000)", y = "上垒率 (On Base Percentage, *1000)", color = "球员编号", size = "统计周次" ) + theme_bw()
可选优化方案
- 若球队球员数量较少,可将颜色映射改为
First,直接用球员姓名作为颜色图例 - 可在坐标轴增加联盟平均水平的参考线,更直观对比球员指标位置
- 可给散点增加
GamesPlayed对应的透明度映射,出赛场次越多的球员点位越实
内容的提问来源于stack exchange,提问作者Daniel H
相关产品推荐
相关产品推荐

