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

