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

如何用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)))

代码说明

  1. 先从原数据框中筛选出Session_Epoch == 1的子集df_first_epoch,并按Participant和Session排序,确保连线顺序是按会话先后排列。
  2. 在geom_path中指定使用这个子集数据,通过group = Participant让每个参与者的所有首个Session_Epoch点归为同一组,从而实现跨Session的连线。
  3. 保留原有的geom_point来展示所有数据点,不影响其他点的可视化效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:43:30