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

如何用ggplot基于city、rank、year三组数据绘制折线图?

用ggplot按多维度分组绘制折线图

首先确保加载ggplot2包:

library(ggplot2)

你的原始数据如下:

gfg_data <- data.frame(year = c(2019, 2019, 2019, 2020, 2020, 2020, 2019, 2019, 2019, 2020, 2020, 2020),
                   city = c('Paris', 'Paris', 'Paris', 'Paris', 'Paris', 'Paris', 'Baku', 'Baku', 'Baku', 'Baku', 'Baku', 'Baku'),
                   rank = c('1-3', '1-3', '1-3', '4-6', '4-6', '4-6', '1-3', '1-3', '1-3', '4-6', '4-6', '4-6'),
                   Timings = c(5, 6, 4, 2, 3, 4, 11, 13, 15, 14, 17, 12),
                   Laps = c(1,2,3,1,2,3,1,2,3,1,2,3))

解决方案:合并多维度为分组标识

要实现按year、city、rank三个维度的每个组合绘制独立折线,核心是让ggplot识别每个唯一组合为单独分组,有两种简洁方式:

方式1:直接用interaction()生成分组

在aes()中通过interaction(year, city, rank)自动生成三个变量的唯一组合作为分组,同时用颜色和线型区分不同组:

ggplot(gfg_data, aes(x = Laps, y = Timings, 
                     group = interaction(year, city, rank),
                     color = interaction(year, city, rank),
                     linetype = interaction(year, city, rank))) +
  geom_line(linewidth = 1) +  # 可选:调整折线粗细
  labs(title = "圈速随圈数变化(按年份/城市/排名分组)",
       x = "圈数",
       y = "用时",
       color = "分组",
       linetype = "分组") +
  theme_minimal()

方式2:手动创建友好分组标签

如果希望分组显示为2019/Paris/1-3这种直观格式,可以先给数据添加新列,再用于分组:

# 创建分组标签列
gfg_data$group <- paste(gfg_data$year, gfg_data$city, gfg_data$rank, sep = "/")

# 绘图
ggplot(gfg_data, aes(x = Laps, y = Timings, 
                     group = group,
                     color = group,
                     linetype = group)) +
  geom_line(linewidth = 1) +
  labs(title = "圈速随圈数变化(按年份/城市/排名分组)",
       x = "圈数",
       y = "用时",
       color = "分组",
       linetype = "分组") +
  theme_minimal()

说明

  • group参数是ggplot识别折线分组的关键,确保每个year/city/rank组合对应一条独立折线
  • color和linetype参数用于可视化区分不同组,便于快速识别
  • 可根据需求调整theme、linewidth、标签文字等细节

内容的提问来源于stack exchange,提问作者EV_Mustang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:20:26