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

如何在R的ggplot2中同一张图绘制多条折线?

正确实现方式

你原来的代码存在两个核心问题:

  • geom_line的aes参数里,filter返回的是完整数据框,不是单一数值列,不符合y轴的要求
  • 没有明确指定分组规则,ggplot无法识别哪些点属于同一条折线

推荐方法(简洁符合ggplot语法)

首先需要给每个Name组添加观测序号作为x轴(折线图需要有序的x轴来连接点),然后利用ggplot的分组美学自动生成折线:

library(tidyverse)

# 原始数据
df <- tribble(~Name, ~Numeric,
              "Python", 9, 
              "R", 14,
              "Java", 3, 
              "Python", 6, 
              "R", 20,)

# 为每个分组添加观测序号
df <- df %>%
  group_by(Name) %>%
  mutate(Observation = row_number()) %>% # 标记每个Name下的观测顺序
  ungroup()

# 绘制折线图
df_viz <- ggplot(data = df, aes(x = Observation, y = Numeric)) +
  geom_line(aes(group = Name, color = Name)) + # 按Name分组并区分颜色
  labs(x = "观测序号", y = "数值", color = "语言") # 添加轴标签与图例标题

手动指定分组的方法(不推荐,仅作参考)

如果你一定要逐个指定每个组的折线,可以先拆分数据再分别绘制,但这种方式冗余且不符合ggplot的设计逻辑:

# 拆分数据
df_python <- df %>% filter(Name == "Python") %>% mutate(Observation = row_number())
df_r <- df %>% filter(Name == "R") %>% mutate(Observation = row_number())
df_java <- df %>% filter(Name == "Java") %>% mutate(Observation = row_number())

# 绘制
df_viz <- ggplot() +
  geom_line(data = df_python, aes(x = Observation, y = Numeric, color = "Python")) +
  geom_line(data = df_r, aes(x = Observation, y = Numeric, color = "R")) +
  geom_line(data = df_java, aes(x = Observation, y = Numeric, color = "Java")) +
  scale_color_identity(guide = "legend") + # 让颜色映射生效并显示图例
  labs(x = "观测序号", y = "数值", color = "语言")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:00:28