如何将ggplot折线图X轴日期替换为‘day 1’等标识并合并多图?
解决方案
一、替换X轴为“day 1”“day 2”场次标识
有两种实现方式,按需选择:
方式1:修改原始数据生成场次标签
先给数据按日期排序,生成对应的场次列,再用这个列作为X轴:
library(dplyr) library(ggplot2) # 给P07的数据添加场次标签(按日期顺序) p07_points_scored <- p07_points_scored %>% arrange(day) %>% mutate(day_session = paste0("day ", row_number())) # 修改后的绘图代码 ggplot(data = p07_points_scored, aes(x = day_session, y = total_score, group = 1)) + geom_line() + geom_point() + theme(axis.text.x = element_text(angle = 60, vjust = 0.5)) + labs(title = "P07's Total Score on the Training Tool", x = "Training Session", y = "Total Score") + geom_smooth()
方式2:直接修改X轴刻度标签(不改动原始数据)
如果不想修改数据,直接通过scale_x_discrete替换刻度文本:
# 生成对应场次标签(按日期顺序) day_labels <- paste0("day ", seq_along(unique(p07_points_scored$day))) ggplot(data = p07_points_scored, aes(x = factor(day), y = total_score, group = 1)) + geom_line() + geom_point() + scale_x_discrete(labels = day_labels) + # 替换X轴刻度 theme(axis.text.x = element_text(angle = 60, vjust = 0.5)) + labs(title = "P07's Total Score on the Training Tool", x = "Training Session", y = "Total Score") + geom_smooth()
二、合并4个参与者的折线图
当然可以合并,步骤如下:
1. 合并多份数据
先把4个参与者的数据合并成一个数据框,同时添加标识列区分不同参与者:
# 假设你的4份数据分别是p07、p08、p09、p10_points_scored combined_data <- bind_rows( p07 = p07_points_scored, p08 = p08_points_scored, p09 = p09_points_scored, p10 = p10_points_scored, .id = "participant" ) # 给合并后的数据统一生成场次标签(每个参与者按自身日期顺序) combined_data <- combined_data %>% group_by(participant) %>% arrange(day) %>% mutate(day_session = paste0("day ", row_number())) %>% ungroup()
2. 绘制合并图表
有两种展示方式:
方式1:同图多折线(颜色区分参与者)
适合对比不同参与者的得分趋势:
ggplot(data = combined_data, aes(x = day_session, y = total_score, group = participant, color = participant)) + geom_line() + geom_point() + theme(axis.text.x = element_text(angle = 60, vjust = 0.5)) + labs(title = "Total Scores on the Training Tool by Participant", x = "Training Session", y = "Total Score", color = "Participant") + geom_smooth(aes(group = participant))
方式2:分面子图(每个参与者单独展示)
适合清晰查看每个参与者的细节:
ggplot(data = combined_data, aes(x = day_session, y = total_score, group = 1)) + geom_line() + geom_point() + geom_smooth() + theme(axis.text.x = element_text(angle = 60, vjust = 0.5)) + labs(title = "Total Scores on the Training Tool by Participant", x = "Training Session", y = "Total Score") + facet_wrap(~participant) # 按参与者分面,也可用facet_grid做行列布局
注意:如果需要统一所有子图的X/Y轴范围,可在
facet_wrap里添加scales = "fixed"参数。
内容的提问来源于stack exchange,提问作者JacobHad
相关产品推荐
相关产品推荐

