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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:48:46