如何在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
相关产品推荐
相关产品推荐

