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

如何用ggplot在同一图中绘制Test与Train的geom_line和geom_point

解决ggplot绘制双折线+散点的需求

嘿,我来帮你搞定这个绘图需求~首先先确认下你的数据框(我把它命名为df方便复现):

df <- structure(list(Percent = c(1, 2, 3, 4, 5), Test = c(4, 2, 3, 5, 2), Train = c(10, 12, 10, 13, 15)), .Names = c("Percent", "Test", "Train"), row.names = c(NA, 5L), class = "data.frame")

你的现有代码只绘制了Test组的散点和折线,要同时加上Train组,有两种常用方法,我推荐第一种更规范简洁的方式:

方法一:转换为长格式(推荐)

这是符合tidy data原则的做法,把宽格式的数据转换成长格式后,ggplot可以自动分组绘图,还能自动生成图例:

首先需要用到tidyr包的pivot_longer函数来转换数据格式,然后再绘图:

library(ggplot2)
library(tidyr)

# 将宽格式数据转成长格式
df_long <- df %>%
  pivot_longer(
    cols = c(Test, Train),  # 需要转换的列
    names_to = "Dataset",   # 新的分组列名
    values_to = "Value"     # 对应的值列名
  )

# 绘制双折线+散点
ggplot(df_long, aes(x = Percent, y = Value, color = Dataset)) +
  geom_point(size = 3) +  # 调整散点大小让它更显眼
  geom_line(linewidth = 1) +  # 调整线宽提升可读性
  labs(
    title = "Test vs Train Performance by Percent",
    x = "Percent",
    y = "Metric Value",
    color = "Data Group"
  ) +
  theme_minimal()

这样代码会自动为Test和Train生成不同颜色的折线和散点,同时右侧会出现对应的图例,后期如果要添加更多组,只需要修改转换列的参数即可,非常灵活。

方法二:直接添加多图层(不转换格式)

如果你不想转换数据格式,也可以手动为每个组添加对应的散点和折线图层:

library(ggplot2)

ggplot(df, aes(x = Percent)) +
  # 绘制Test组的散点和折线
  geom_point(aes(y = Test), color = "#2196F3", size = 3) +
  geom_line(aes(y = Test), color = "#2196F3", linewidth = 1) +
  # 绘制Train组的散点和折线
  geom_point(aes(y = Train), color = "#F44336", size = 3) +
  geom_line(aes(y = Train), color = "#F44336", linewidth = 1) +
  labs(
    title = "Test vs Train Performance by Percent",
    x = "Percent",
    y = "Metric Value"
  ) +
  theme_minimal()

这种方法需要手动指定每组的颜色,缺点是如果分组较多,代码会变得冗长,而且需要手动添加图例(如果需要的话),所以更推荐第一种长格式的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:59:36