如何用ggplot仅为每个参与者连接首个Session_Epoch的跨Session散点?
问题:仅连接每个参与者跨Session的首个Session_Epoch数据点
我查阅了类似问题但未找到答案,也不清楚代码失效的原因。
数据生成代码
# 参与者、会话、会话阶段数量 n_participants <- 5 n_sessions <- 7 n_session_epochs <- 4 # 创建初始数据框 participant_ids <- paste0("ID-", 1:n_participants) sessions <- 1:n_sessions session_epochs <- 1:n_session_epochs # 生成所有组合的基础数据框 df <- expand.grid(Participant = participant_ids, Session = sessions, Session_Epoch = session_epochs) # 添加随机F_response值 set.seed(123) # 保证结果可复现 df$F_response <- sample(1:4, nrow(df), replace = TRUE) # 生成递增准确率的函数 generate_accuracy <- function() { start_value <- runif(1, 0, 0.25) end_value <- 1 seq(from = start_value, to = end_value, length.out = n_sessions * n_session_epochs) } # 为每个参与者生成准确率数据并整合 accuracy_values <- replicate(n_participants, generate_accuracy()) df$Accuracy <- as.vector(t(accuracy_values)) # 按参与者、会话、会话阶段排序 df <- df %>% arrange(Participant, Session, Session_Epoch)
尝试的失效代码
我希望绘制图表,仅为每个参与者连接跨Session的首个Session_Epoch数据点,尝试了以下代码但未达到预期效果:
(a = df %>% mutate(grp = if_else(Session_Epoch == 1, Session, NA)) %>% ggplot(aes(x = Accuracy, y = F_response)) + geom_point(aes(color = as.factor(Session), shape = as.factor(Session_Epoch)), size=3) + geom_hline(yintercept = 0,linetype = "dashed", color = "grey") + geom_path(aes(group = as.factor(grp))) + theme_bw() + facet_grid(~Participant) + theme(text = element_text(size = 15)))
生成的图表中没有出现跨Session的连线,不符合需求。
失效原因与解决方案
失效原因
你设置的grp逻辑有误:当Session_Epoch == 1时,grp被赋值为Session,这会让每个首个Session_Epoch的点属于独立分组。而geom_path只会连接同一组内的点,因此无法将不同Session的首个点连接起来。此外,你没有明确筛选出仅用于连线的首个Session_Epoch数据,导致逻辑混乱。
修正代码
library(tidyverse) # 筛选每个参与者每个Session的首个Session_Epoch数据,按会话顺序排序 df_first_epoch <- df %>% filter(Session_Epoch == 1) %>% arrange(Participant, Session) # 绘制图表 (a = ggplot(df, aes(x = Accuracy, y = F_response)) + # 绘制所有数据点 geom_point(aes(color = as.factor(Session), shape = as.factor(Session_Epoch)), size=3) + geom_hline(yintercept = 0, linetype = "dashed", color = "grey") + # 仅连接每个参与者的首个Session_Epoch点,按参与者分组保证连线正确 geom_path(data = df_first_epoch, aes(group = Participant), color = "black", linewidth = 1) + theme_bw() + facet_grid(~Participant) + theme(text = element_text(size = 15)))
代码说明
- 先从原数据框中筛选出
Session_Epoch == 1的子集df_first_epoch,并按Participant和Session排序,确保连线顺序是按会话先后排列。 - 在
geom_path中指定使用这个子集数据,通过group = Participant让每个参与者的所有首个Session_Epoch点归为同一组,从而实现跨Session的连线。 - 保留原有的
geom_point来展示所有数据点,不影响其他点的可视化效果。
内容的提问来源于stack exchange,提问作者Chiara Toschi
相关产品推荐
相关产品推荐

