R语言实现同列分组F1车手累计积分时序图绘制
R绘制F1车手累计积分时序对比图方案
你当前给出的示例构造代码有两个需要修正的点:一是用cbind直接拼接字符型车手名和数值型积分会生成字符矩阵,把积分转成文本格式无法计算/绘图;二是缺少时序图必须的x轴维度——也就是每一行积分对应的比赛站次,预处理阶段补全即可。
数据预处理
如果你的原始数据已经是规范的三列结构(车手名称、单站积分、累计积分),只需要按车手分组生成每一行对应的比赛轮次就行,不需要重新计算累计值。参考预处理代码如下:
# 用到ggplot2绘图的话先加载包 library(ggplot2) library(dplyr) # 修正示例数据结构,转成标准数据框 f1_data <- data.frame( driver = rep(c("Driver A", "Driver B"), each = 3), single_points = c(1,5,7,3,5,8) ) %>% group_by(driver) %>% mutate( # 生成每个车手对应的比赛站次 race_round = row_number(), # 如果你已有累计积分列,删掉下面这行直接用现有列即可 cum_points = cumsum(single_points) ) %>% ungroup()
绘图实现
方法1:用R基础绘图函数(无需额外装包)
# 提取所有车手名单 all_drivers <- unique(f1_data$driver) # 先绘制第一位车手的曲线作为底图 first_driver_data <- subset(f1_data, driver == all_drivers[1]) plot( x = first_driver_data$race_round, y = first_driver_data$cum_points, type = "l", lwd = 2, col = 1, xlab = "比赛站次", ylab = "累计积分", main = "F1车手累计积分对比", ylim = c(0, max(f1_data$cum_points)) ) # 循环添加其余车手的曲线 for (i in 2:length(all_drivers)) { tmp_data <- subset(f1_data, driver == all_drivers[i]) lines( x = tmp_data$race_round, y = tmp_data$cum_points, lwd = 2, col = i ) } # 添加图例 legend("topleft", legend = all_drivers, col = 1:length(all_drivers), lwd = 2)
方法2:用ggplot2绘制(更易调整样式、适配多车手场景)
ggplot(f1_data, aes(x = race_round, y = cum_points, color = driver, group = driver)) + geom_line(linewidth = 1.2) + geom_point(size = 2) + # 可选,给每站的积分点加标记 labs( x = "比赛站次", y = "累计积分", color = "车手姓名", title = "F1车手累计积分时序对比" ) + theme_bw() # 可选,替换为清爽的白底主题
提示:如果你的数据里有具体的比赛日期列,直接把代码里的
race_round替换成日期列,就能生成按真实时间排列的时序图;如果需要标注退赛、分站冠军等特殊节点,直接加geom_text图层标注即可。
内容的提问来源于stack exchange,提问作者xnalahp
相关产品推荐
相关产品推荐

