python数据可视化方块图_python数据可视化学习10:绘制六张图一起展示的案例

本文展示了如何使用Python的matplotlib库创建并组合多个图表,包括散点图、折线图、直方图、条形图、饼图和箱线图。通过设置图表风格、调整子图属性、添加注释和箭头,详细解释了每个图表的绘制过程,是Python数据可视化学习的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from matplotlib import pyplot as plt

import pandas as pd

import numpy as np

import matplotlib

plt.rcParams['font.sans-serif'] = 'SimHei'

plt.rcParams['axes.unicode_minus'] = False

matplotlib.style.use('ggplot')  # 设置图表风格 这个是R语言常用的风格

# 存储和展示图像

# 绘制六张图一起展示的案例

# 创建画布

fig = plt.figure(figsize=(12, 7))

# --------添加第一个子图--------

sp1 = fig.add_subplot(2, 3, 1)

# 第一个子图的属性调整和绘制

# (1)设置标题

plt.title("第一个子图:散点图")

# (2)x轴和y轴名称

plt.xlabel("x轴标签")

plt.ylabel("y轴标签")

# (3)x轴和y轴的刻度

plt.xticks([1, 2, 3])

plt.yticks(range(2, 9, 2))

# (4)绘制图形

plt.scatter([1, 2, 3], [4, 8, 1], color="g", marker="D", label="point1")

plt.scatter([1, 2, 3], [7, 2, 5], color="r", marker="o", label="point2")

# (5)设置图例

plt.legend(loc=1)

# --------添加第二个子图--------

sp2 = fig.add_subplot(2, 3, 2)

# 第二个子图的属性调整和绘制

# (1)设置标题

plt.title("第二个子图:折线图")

# (2)x轴和y轴名称

plt.xlabel("x轴标签")

plt.ylabel("y轴标签")

# (3)x轴和y轴的刻度

plt.xticks([1, 2, 3])

plt.yticks(range(2, 9, 2))

# (4)绘制图形

plt.plot([1, 2, 3], [4, 8, 1],

color="g", linestyle="--",

marker="D", label="line1")

plt.plot([1, 2, 3], [7, 2, 5],

color="m", linestyle=":",

marker="x", label="line2")

# (5)设置图例

plt.legend(loc=1)

# --------添加第三个子图--------

sp3 = fig.add_subplot(2, 3, 3)

# 第三个子图的属性调整和绘制

# (1)设置标题

plt.title("第三个子图:直方图")

# (2)x轴和y轴名称

plt.xlabel("x轴标签")

plt.ylabel("y轴标签")

# (3)x轴和y轴的刻度

plt.xticks(np.arange(-5, 6))

# (4)绘制图形

plt.hist(np.random.randn(100000), 1000)

# (5)添加注释和箭头

# plt.text(2, 370, '众数')

plt.annotate('众数', xy=(0.0, 360), xytext=(2, 350),

arrowprops=dict(facecolor='black', shrink=0.01))

# --------添加第四个子图--------

sp4 = fig.add_subplot(2, 3, 4)

# 第四个子图的属性调整和绘制

# (1)设置标题

plt.title("第四个子图:条形图")

# (2)x轴和y轴名称

plt.xlabel("城市")

plt.ylabel("人口")

# (3)x轴和y轴的刻度

# (4)绘制图形

plt.bar(["北京", "郑州", "驻马店"], [2000, 1500, 1000])

# --------添加第五个子图--------

sp5 = fig.add_subplot(2, 3, 5)

# 第五个子图的属性调整和绘制

# (1)设置标题

plt.title("第五个子图:饼图")

# (2)x轴和y轴名称

# (3)x轴和y轴的刻度

# (4)绘制图形

plt.pie([2000, 1500, 1000], labels=["北京", "郑州", "驻马店"], autopct="%.2f%%")

# --------添加第六个子图--------

sp6 = fig.add_subplot(2, 3, 6)

# 第六个子图的属性调整和绘制

# (1)设置标题

plt.title("第六个子图:箱线图")

# (2)x轴和y轴名称

plt.xlabel("城市")

plt.ylabel("人口")

# (3)x轴和y轴的刻度

# (4)绘制图形

plt.boxplot([np.random.randn(100), np.random.randn(100), np.random.randn(100)], meanline=True)

# --------统一调整子图间距--------

fig.subplots_adjust(wspace=0.3,hspace=0.5)

# --------保存图片--------

fig.savefig("E:\工作\woquxuexi\文章\sixsixsix.png")

plt.show()

# -*- coding: utf-8 -*- import scipy.io import numpy as np import matplotlib.pyplot as plt from scipy import signal import pandas as pd import seaborn as sns import os from scipy import stats # 表中文配置 plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体显示中文 plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题 def process_alpha_eeg_data(mat_file_path): """ 处理脑电数据 参数: mat_file_path: .mat文件路径 返回: fig_time_series: 时间序列表对象 fig_comparison: 条件比较表对象 fig_alpha_power: Alpha功率随时间变化表对象 results_df: 包含所有分析结果的DataFrame p_value: 统计显著性p值 """ # 1. 加载.mat文件数据 mat_data = scipy.io.loadmat(mat_file_path) # 2. 提取数据矩阵 if 'data' not in mat_data: # 改进的数据矩阵检测 valid_keys = [k for k in mat_data.keys() if not k.startswith('__') and isinstance(mat_data[k], np.ndarray) and mat_data[k].ndim == 2] if not valid_keys: raise ValueError("未找到有效的2D数据矩阵") # 选择最大的数据矩阵 data_matrix = mat_data[max(valid_keys, key=lambda k: mat_data[k].size)] print(f"使用自动检测的数据矩阵: {max(valid_keys, key=lambda k: mat_data[k].size)}") else: data_matrix = mat_data['data'] # 3. 解析数据矩阵结构 timestamps = data_matrix[:, 0] # 时间戳 # 检查数据列数 num_columns = data_matrix.shape[1] if num_columns < 19: raise ValueError(f"数据矩阵只有 {num_columns} 列,需要至少19列 (时间戳 + 16个EEG通道 + 2个触发器)") eeg_data = data_matrix[:, 1:17] # 16个EEG通道 trigger_eyes_closed = data_matrix[:, 17] # 闭眼触发器 trigger_eyes_open = data_matrix[:, 18] # 睁眼触发器 # 固定采样率512Hz sampling_rate = 512.0 # 4. 预处理 - 带通滤波和陷波滤波 def preprocess(data): """应用带通滤波和陷波滤波预处理EEG数据""" # 带通滤波提取Alpha波 (8-12Hz) nyquist = 0.5 * sampling_rate low = 8 / nyquist high = 12 / nyquist b, a = signal.butter(4, [low, high], btype='bandpass') alpha_data = signal.filtfilt(b, a, data) # 陷波滤波去除50/60Hz工频干扰 notch_freq = 50.0 # 根据实际工频干扰调整 notch_width = 2.0 freq = notch_freq / nyquist q = freq / (notch_width / nyquist) b, a = signal.iirnotch(freq, q) return signal.filtfilt(b, a, alpha_data) # 应用预处理到所有通道 eeg_data_filtered = np.apply_along_axis(preprocess, 0, eeg_data) # 5. 计算注意力指数 def calculate_attention(alpha_data): """计算基于Alpha波的注意力指数""" # 计算Alpha波能量 (RMS) alpha_energy = np.sqrt(np.mean(alpha_data**2)) # 计算注意力指数 (与Alpha能量负相关) attention_index = 1 / (1 + alpha_energy) # 归一化到0-100范围 attention_index = np.clip(attention_index * 100, 0, 100) return attention_index # 6. 识别所有会话块 def find_sessions(trigger): """识别所有会话的开始和结束""" # 找到所有上升沿(会话开始) trigger_diff = np.diff(trigger) session_starts = np.where(trigger_diff == 1)[0] + 1 # 找到所有下降沿(会话结束) session_ends = np.where(trigger_diff == -1)[0] + 1 # 确保每个开始都有对应的结束 sessions = [] for start in session_starts: # 找到下一个结束点 ends_after_start = session_ends[session_ends > start] if len(ends_after_start) > 0: end = ends_after_start[0] sessions.append((start, end)) return sessions # 获取所有会话块(闭眼和睁眼) closed_eye_sessions = find_sessions(trigger_eyes_closed) open_eye_sessions = find_sessions(trigger_eyes_open) # 7. 处理每个会话块 - 使用固定10秒时长 session_results = [] session_duration_sec = 10.0 # 每个会话固定10秒 # 为不同条件创建单独的计数器 closed_counter = 1 open_counter = 1 # 处理闭眼会话块 for session_idx, (start_idx, end_idx) in enumerate(closed_eye_sessions): # 提取会话数据 session_eeg = eeg_data_filtered[start_idx:end_idx, :] # 计算整个会话块的平均注意力指数 channel_attention = [] for ch in range(session_eeg.shape[1]): attention = calculate_attention(session_eeg[:, ch]) channel_attention.append(attention) session_avg_attention = np.mean(channel_attention) # 存储会话结果 session_results.append({ 'session_id': f"闭眼{closed_counter}", 'condition': '闭眼', 'start_time': timestamps[start_idx], 'duration': session_duration_sec, 'avg_attention': session_avg_attention, 'channel_attention': channel_attention }) # 更新闭眼会话计数器 closed_counter += 1 # 处理睁眼会话块 for session_idx, (start_idx, end_idx) in enumerate(open_eye_sessions): # 提取会话数据 session_eeg = eeg_data_filtered[start_idx:end_idx, :] # 计算整个会话块的平均注意力指数 channel_attention = [] for ch in range(session_eeg.shape[1]): attention = calculate_attention(session_eeg[:, ch]) channel_attention.append(attention) session_avg_attention = np.mean(channel_attention) # 存储会话结果 session_results.append({ 'session_id': f"睁眼{open_counter}", 'condition': '睁眼', 'start_time': timestamps[start_idx], 'duration': session_duration_sec, 'avg_attention': session_avg_attention, 'channel_attention': channel_attention }) # 更新睁眼会话计数器 open_counter += 1 # 创建结果DataFrame results_df = pd.DataFrame(session_results) # 8. 可视化结果 - 拆分为三张独立的表 # 表1: 随时间变化的注意力指数 fig_time_series = plt.figure(figsize=(14, 7)) ax1 = fig_time_series.add_subplot(111) # 为不同条件设置不同颜色 colors = {'闭眼': 'blue', '睁眼': 'orange'} # 为每个会话块创建三个子点 segment_results = [] # 处理所有会话块,为每个会话块创建三个子点 for i, row in results_df.iterrows(): # 计算三个子点的位置和值 for seg_idx in range(3): # 子点值 = 主点值 + 随机偏移(模拟变化) offset = np.random.uniform(-5, 5) # 小范围随机偏移 segment_value = max(0, min(100, row['avg_attention'] + offset)) segment_results.append({ 'session_id': row['session_id'], 'condition': row['condition'], 'session_idx': i, # 会话索引 'segment_idx': seg_idx, 'value': segment_value, 'x_position': i + seg_idx * 0.3 # 在x轴上均匀分布 }) segment_df = pd.DataFrame(segment_results) # 绘制每个会话块的三个子点 for session_id in segment_df['session_id'].unique(): session_data = segment_df[segment_df['session_id'] == session_id] condition = session_data['condition'].iloc[0] color = colors[condition] # 绘制折线连接三个子点(同一会话块内) ax1.plot(session_data['x_position'], session_data['value'], 'o-', markersize=8, color=color, alpha=0.7, linewidth=1.5) # 添加数值标签 - 增大字号到11 for _, seg_row in session_data.iterrows(): ax1.text(seg_row['x_position'], seg_row['value'] + 2, f"{seg_row['value']:.1f}", ha='center', va='bottom', fontsize=11) # 字号从9增大到11 # 连接同一条件下相邻会话块的首尾点 for condition in ['闭眼', '睁眼']: condition_data = segment_df[segment_df['condition'] == condition] # 按会话索引排序 condition_data = condition_data.sort_values('session_idx') # 获取所有会话索引 session_indices = condition_data['session_idx'].unique() session_indices.sort() # 连接相邻会话块 for i in range(len(session_indices) - 1): # 前一个会话的最后一个点(segment_idx=2) prev_session = condition_data[ (condition_data['session_idx'] == session_indices[i]) & (condition_data['segment_idx'] == 2) ] # 后一个会话的第一个点(segment_idx=0) next_session = condition_data[ (condition_data['session_idx'] == session_indices[i+1]) & (condition_data['segment_idx'] == 0) ] # 确保找到两个点 if len(prev_session) == 1 and len(next_session) == 1: prev_point = prev_session.iloc[0] next_point = next_session.iloc[0] # 绘制连接线(使用与子点相同的样式) ax1.plot( [prev_point['x_position'], next_point['x_position']], [prev_point['value'], next_point['value']], '-', color=colors[condition], alpha=0.7, linewidth=1.5 ) # 设置x轴刻度和标签 ax1.set_xticks(results_df.index) ax1.set_xticklabels(results_df['session_id'], rotation=45, ha='right', fontsize=10) # 调整x轴标签字号 # 设置y轴范围到10-60 ax1.set_ylim(10, 60) ax1.set_title('不同条件下注意力指数随时间变化', fontsize=16) ax1.set_xlabel('会话块ID', fontsize=14) ax1.set_ylabel('平均注意力指数 (%)', fontsize=14) # 添加例 from matplotlib.lines import Line2D legend_elements = [ Line2D([0], [0], marker='o', color='w', markerfacecolor='blue', markersize=10, label='闭眼'), Line2D([0], [0], marker='o', color='w', markerfacecolor='orange', markersize=10, label='睁眼') ] ax1.legend(handles=legend_elements, loc='best', fontsize=12) ax1.grid(True, linestyle='--', alpha=0.3) # 添加分隔线区分不同会话块 for i in range(1, len(results_df)): ax1.axvline(i - 0.5, color='gray', linestyle='--', alpha=0.5) plt.tight_layout() # 表2: 闭眼与睁眼条件下的注意力比较 fig_comparison = plt.figure(figsize=(10, 6)) ax2 = fig_comparison.add_subplot(111) # 箱线展示条件间差异 sns.boxplot(x='condition', y='avg_attention', data=results_df, ax=ax2, palette='Set2', hue='condition', legend=False) # 添加散点显示个体数据点 sns.stripplot(x='condition', y='avg_attention', data=results_df, ax=ax2, color='black', alpha=0.7, size=7, jitter=True) ax2.set_title('闭眼与睁眼条件下注意力比较', fontsize=16) ax2.set_xlabel('条件', fontsize=14) ax2.set_ylabel('平均注意力指数 (%)', fontsize=14) # 添加统计显著性标记(使用独立样本t检验) closed_data = results_df[results_df['condition'] == '闭眼']['avg_attention'] open_data = results_df[results_df['condition'] == '睁眼']['avg_attention'] t_stat, p_value = stats.ttest_ind(closed_data, open_data) # 添加显著性标记 y_max = max(results_df['avg_attention']) + 5 ax2.plot([0, 0, 1, 1], [y_max, y_max+2, y_max+2, y_max], lw=1.5, c='black') ax2.text(0.5, y_max+3, f"p = {p_value:.4f}", ha='center', va='bottom', fontsize=12) plt.tight_layout() # 表3: Alpha功率随时间变化(使用固定10秒时长) fig_alpha_power = plt.figure(figsize=(15, 8)) ax3 = fig_alpha_power.add_subplot(111) # 计算每个时间点的Alpha功率(所有通道的平均RMS) # 使用滑动窗口平均平滑数据(窗口大小=1秒) window_size = int(sampling_rate) # 512个采样点(1秒) alpha_power = np.sqrt(np.mean(eeg_data_filtered**2, axis=1)) # 所有通道的RMS smoothed_alpha_power = np.convolve(alpha_power, np.ones(window_size)/window_size, mode='same') # 绘制整个实验期间的Alpha功率 ax3.plot(timestamps, smoothed_alpha_power, 'b-', linewidth=1.5, alpha=0.8, label='Alpha功率') # 增强背景标注 - 闭眼会话(使用固定10秒时长) for session_idx, (start_idx, end_idx) in enumerate(closed_eye_sessions): start_time = timestamps[start_idx] end_time = start_time + session_duration_sec # 固定10秒时长 # 增强背景色 ax3.axvspan(start_time, end_time, color='royalblue', alpha=0.3, label='闭眼' if session_idx == 0 else "") # 添加文字标注(居中) mid_time = start_time + session_duration_sec/2 y_min, y_max = ax3.get_ylim() label_y = y_min + 0.05 * (y_max - y_min) ax3.text(mid_time, label_y, '闭眼', ha='center', va='bottom', fontsize=12, fontweight='bold', bbox=dict(facecolor='white', alpha=0.7, edgecolor='royalblue', boxstyle='round,pad=0.2')) # 增强背景标注 - 睁眼会话(使用固定10秒时长) for session_idx, (start_idx, end_idx) in enumerate(open_eye_sessions): start_time = timestamps[start_idx] end_time = start_time + session_duration_sec # 固定10秒时长 # 增强背景色 ax3.axvspan(start_time, end_time, color='darkorange', alpha=0.3, label='睁眼' if session_idx == 0 else "") # 添加文字标注(居中) mid_time = start_time + session_duration_sec/2 y_min, y_max = ax3.get_ylim() label_y = y_min + 0.05 * (y_max - y_min) ax3.text(mid_time, label_y, '睁眼', ha='center', va='bottom', fontsize=12, fontweight='bold', bbox=dict(facecolor='white', alpha=0.7, edgecolor='darkorange', boxstyle='round,pad=0.2')) # 添加标记和标签 ax3.set_title('Alpha功率随时间变化(闭眼与睁眼期间)', fontsize=18, fontweight='bold') ax3.set_xlabel('时间 (秒)', fontsize=14) ax3.set_ylabel('Alpha功率 (RMS)', fontsize=14) ax3.grid(True, linestyle='--', alpha=0.3) # 添加例(只显示曲线例) ax3.legend(loc='upper right', fontsize=12) # 添加垂直参考线标记每个会话的开始(使用更明显的颜色) all_sessions = closed_eye_sessions + open_eye_sessions for start_idx, _ in all_sessions: ax3.axvline(x=timestamps[start_idx], color='darkred', linestyle='--', alpha=0.7, linewidth=1.2) # 添加时间轴刻度增强 ax3.xaxis.set_major_locator(plt.MaxNLocator(20)) # 增加刻度数量 # 添加背景色例说明 from matplotlib.patches import Patch legend_elements = [ Patch(facecolor='royalblue', alpha=0.3, edgecolor='royalblue', label='闭眼期间'), Patch(facecolor='darkorange', alpha=0.3, edgecolor='darkorange', label='睁眼期间'), plt.Line2D([0], [0], color='darkred', linestyle='--', label='会话开始') ] ax3.legend(handles=legend_elements, loc='upper left', fontsize=10) # 添加会话时长信息 ax3.text(0.02,0.95, f"每个会话时长: {session_duration_sec}秒", transform=ax3.transAxes, fontsize=12, bbox=dict(facecolor='white', alpha=0.8)) plt.tight_layout() # 9. 保存结果 base_name = os.path.splitext(os.path.basename(mat_file_path))[0] # 保存像 fig_time_series.savefig(f"{base_name}_time_series.png", dpi=300, bbox_inches='tight') fig_comparison.savefig(f"{base_name}_comparison.png", dpi=300, bbox_inches='tight') fig_alpha_power.savefig(f"{base_name}_alpha_power.png", dpi=300, bbox_inches='tight') # 保存结果到CSV results_df.to_csv(f"{base_name}_results.csv", index=False, encoding='utf-8-sig') return fig_time_series, fig_comparison, fig_alpha_power, results_df, p_value # 主程序入口 if __name__ == "__main__": # 输入文件路径 mat_file = "F:/Grade2/attention/2348892/subject_02.mat" try: # 处理数据并生成可视化 fig1, fig2, fig3, results_df, p_value = process_alpha_eeg_data(mat_file) # 显示像 plt.show() # 打印会话结果和统计显著性 - 英文输出 print("EEG Analysis Results:") print(results_df[['session_id', 'condition', 'duration', 'avg_attention']]) print(f"\nStatistical Significance: p = {p_value:.4f}") # 根据p值输出不同结论 - 英文输出 if p_value < 0.05: print("There is a significant difference between eyes-closed and eyes-open conditions (p < 0.05)") else: print("No significant difference between eyes-closed and eyes-open conditions") except Exception as e: # 错误处理 - 保持英文错误信息 print(f"Error during processing: {str(e)}") import traceback traceback.print_exc() 将该代码修改为,提供一个文件夹的路径后,可以读取该文件内全部的mat文件,并且1、2和3的输出为所有mat文件的结果的平均值
最新发布
06-28
<think>我们需要修改代码以处理整个文件夹中的多个.mat文件,并计算所有文件结果的平均值,然后绘制平均后的表。主要步骤:1.修改主函数,使其能够遍历指定文件夹中的所有.mat文件。2.对每个文件进行处理,收集每个文件的中间结果(例如每个会话的注意力指数、Alpha功率等)。3.计算所有文件的平均值(注意:不同文件可能有不同数量的会话,我们需要按条件(闭眼/睁眼)和会话顺序进行平均)。4.根据平均值重新绘制三张。然而,由于每个文件的会话块数量可能不同,我们需要考虑如何对齐会话块。这里我们假设每个文件都有相同数量的闭眼和睁眼会话块(例如都是3个闭眼和3个睁眼)。如果实际情况不同,我们需要调整策略(例如按会话顺序平均前N个会话,或者取所有文件的最小会话数)。由于问题描述中要求输出为所有mat文件结果的平均值,我们将采取以下策略: -对于1(随时间变化的注意力指数):我们按会话块顺序(闭眼1,闭眼2,...,睁眼1,睁眼2,...)对齐所有文件,然后计算每个会话块(包括子点)的平均值。-对于2(条件比较):我们将所有文件的每个会话块(闭眼和睁眼)的注意力指数合并,然后绘制箱线,并计算合并后的t检验。-对于3(Alpha功率随时间变化):由于每个文件的时间戳不同,难以直接平均。我们可以考虑按时间百分比(归一化时间)来平均,或者只展示一个代表性的文件?但问题要求平均值,所以我们可以将每个会话块(闭眼或睁眼)内的Alpha功率按时间归一化(例如分成100个时间点),然后计算所有文件中相同条件相同时间点的平均值。但是,考虑到3的复杂性以及每个文件的时间长度可能不一致,我们可能需要重新考虑3的处理。由于题目要求3输出为所有mat文件结果的平均值,我们可以这样处理:-将每个文件中的每个会话块(闭眼或睁眼)独立处理,将会话块内的数据按固定时间点(0-10秒,步长0.1秒)进行插值,得到每个时间点的Alpha功率(所有通道平均)。-然后按条件(闭眼/睁眼)和会话块顺序(第一个闭眼、第二个闭眼...)分别计算所有文件在同一条件同一会话块同一时间点的平均值。然而,这样3会变得非常复杂(有多个会话块)。或者,我们可以简化:只绘制第一个闭眼会话块和第一个睁眼会话块的平均Alpha功率变化(假设每个文件都有至少一个闭眼和一个睁眼会话块)。由于时间关系,我们可能需要简化需求,特别是3。但题目要求三张都是所有mat文件的平均结果,因此我们这样设计:1:按会话块顺序(所有文件按顺序排列:闭眼1,闭眼2,...,睁眼1,睁眼2,...)计算每个会话块的平均注意力指数(包括三个子点)。注意,每个文件可能有不同数量的会话块,因此我们取最小会话块数(按条件分别取最小闭眼会话数和睁眼会话数)来保证每个文件都有该会话块。2:直接合并所有文件的所有会话块(闭眼和睁眼)的注意力指数,然后绘制箱线,并计算t检验。3:我们选择每个文件的第一个闭眼会话块和第一个睁眼会话块(假设每个文件都有),将会话块内的Alpha功率(所有通道平均)按时间归一化(0-10秒),然后计算所有文件在相同时间点的平均值,绘制两条曲线(闭眼和睁眼)。具体步骤:1.修改主函数,使其接受一个文件夹路径,并遍历所有.mat文件。2.为每个文件调用原来的处理函数,收集以下数据:-每个会话块的注意力指数(包括三个子点的值)以及条件、会话ID等信息。-每个会话块的平均注意力指数(用于2)。-每个文件的第一个闭眼和第一个睁眼会话块的Alpha功率(按时间插值到固定时间点)。3.计算平均值:-1:按会话块顺序(闭眼1,闭眼2,...,睁眼1,睁眼2,...)对齐,计算每个会话块中每个子点的平均值(所有文件同一会话块同一子点位置的平均值)。-2:合并所有会话块(闭眼和睁眼)的注意力指数,然后绘制箱线,并计算t检验。-3:计算所有文件第一个闭眼会话块和第一个睁眼会话块在每个时间点的平均Alpha功率。由于修改较大,我们将重构代码。注意:原代码中1的每个会话块有三个子点,我们假设每个文件的每个会话块都有三个子点(原代码中每个会话块生成三个子点)。实现步骤:1.创建一个新的函数`process_folder(folder_path)`,用于处理文件夹。2.在该函数中,遍历文件夹中的所有.mat文件,对每个文件调用`process_alpha_eeg_data`函数(需要修改该函数,使其返回更详细的数据,以便后续平均)。3.收集每个文件的结果:-1需要的数据:每个会话块的三个子点的值(按条件、会话顺序排列)。-2需要的数据:每个会话块的平均注意力指数(按条件)。-3需要的数据:每个文件的第一个闭眼和第一个睁眼会话块的Alpha功率(按时间插值到100个点)。4.计算1的平均值:-首先,确定每个条件(闭眼、睁眼)的最小会话块数(在所有文件中)。例如,闭眼最小会话块数为min_closed,睁眼为min_open。-然后,对于每个会话块(从0到min_closed-1的闭眼,从0到min_open-1的睁眼),将该会话块的三个子点的值(所有文件)取平均。-最后,按照闭眼1到闭眼min_closed,睁眼1到睁眼min_open的顺序排列,绘制1。5.2:将每个文件的所有会话块(闭眼和睁眼)的`avg_attention`合并,然后绘制箱线,并计算t检验。6.3:-对于闭眼:取每个文件的第一个闭眼会话块,将会话块内的Alpha功率(原代码中计算的是整个实验期间的,我们需要提取该会话块内的数据)按时间归一化到0-10秒,然后线性插值到100个时间点(每个时间点0.1秒)。-同样,对睁眼第一个会话块做同样处理。-然后计算所有文件在100个时间点的平均值(闭眼和睁眼分别计算),绘制两条曲线。7.保存平均后的表。由于原代码较长,我们将进行大幅修改。以下是修改后的代码框架:注意:由于时间关系,我们只修改关键部分,并尽量复用原函数。我们将修改`process_alpha_eeg_data`函数,使其返回更多中间数据,并创建一个新的函数`process_folder`。具体修改如下:1.修改`process_alpha_eeg_data`函数,除了返回表对象和结果DataFrame外,还需要返回:-每个会话块的三个子点的值(segment_df)->用于1-每个会话块的平均注意力指数(results_df) ->用于2-第一个闭眼会话块和第一个睁眼会话块的Alpha功率(按时间)->用于32.由于原函数已经计算了每个会话块的平均注意力指数,我们可以直接返回results_df。但是为了得到每个会话块的三个子点,我们返回segment_df。3.对于3,我们需要从原函数中提取第一个闭眼和睁眼会话块的Alpha功率(原始滤波后的数据,但只取该会话块,并计算所有通道的平均RMS,然后按时间归一化)。4.由于原函数中已经计算了整个实验期间的Alpha功率(smoothed_alpha_power),但我们需要单独提取每个会话块,所以需要修改。考虑到这些,我们修改原函数,使其返回:- results_df:每个会话块的平均注意力指数-segment_df:每个会话块的三个子点(包括位置和值)-first_closed_alpha:第一个闭眼会话块的Alpha功率(时间从0到10秒,共5120个点?但我们需要插值到固定点数)- first_open_alpha:第一个睁眼会话块的Alpha功率但是,由于每个会话块固定10秒,采样率512Hz,所以每个会话块有5120个点。我们可以直接取这些点,然后在`process_folder`中统一进行时间归一化(因为不同文件的采样率相同,所以点数相同,不需要插值,直接按时间点对齐即可)。然而,为了确保时间对齐,我们按时间从0到10秒,取每个时间点(0,1/512,2/512,...)的Alpha功率。由于所有文件都是同样的采样率,所以时间点相同。因此,我们可以在`process_alpha_eeg_data`函数中,提取第一个闭眼和睁眼会话块的Alpha功率(所有通道平均RMS)的时间序列(长度为5120)。修改后的`process_alpha_eeg_data`函数返回:-results_df:每个会话块的平均注意力指数(DataFrame)- segment_df:每个会话块的三个子点(DataFrame)- first_closed_alpha:第一个闭眼会话块的Alpha功率(一维数组,长度5120)-first_open_alpha:第一个睁眼会话块的Alpha功率(一维数组,长度5120)-另外,原返回的表对象等不再需要(因为我们要重新平均),所以可以去掉。注意:如果某个文件没有闭眼或睁眼会话块,则跳过。然后,在`process_folder`函数中:-遍历文件夹,收集每个文件的结果(results_df,segment_df, first_closed_alpha, first_open_alpha)。-统计每个条件的最小会话块数(闭眼和睁眼分别统计)。-计算1的平均值:按会话块顺序(闭眼1,闭眼2,...,睁眼1,睁眼2,...)对齐,计算每个会话块的三个子点的平均值(所有文件同一会话块的同一子点位置)。-计算2:合并所有会话块(闭眼和睁眼)的`avg_attention`,然后绘制箱线,并计算t检验。-计算3:计算所有文件第一个闭眼会话块的平均Alpha功率(5120个点的平均值),同样计算睁眼,然后绘制。由于代码量较大,我们逐步实现。注意:原代码中1的x轴位置是根据会话索引和子点索引计算的,在平均后,我们需要重新计算x轴位置(按会话块顺序排列)。由于修改复杂,以下为修改后的代码:</think># 多文件EEG数据分析与平均可视化 我将修改代码以支持处理整个文件夹中的所有MAT文件,并计算所有文件结果的平均值来生成1、2和3。以下是完整的解决方案: ```python # -*- coding: utf-8 -*- import scipy.io import numpy as np import matplotlib.pyplot as plt from scipy import signal import pandas as pd import seaborn as sns import os from scipy import stats import glob # 表中文配置 plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体显示中文 plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题 def process_alpha_eeg_data(mat_file_path): """ 处理单个脑电数据文件 参数: mat_file_path: .mat文件路径 返回: results_df: 包含所有分析结果的DataFrame segment_df: 包含每个会话块子点数据的DataFrame smoothed_alpha_power: Alpha功率随时间变化数据 timestamps: 时间戳数组 closed_eye_sessions: 闭眼会话块信息 open_eye_sessions: 睁眼会话块信息 """ # 1. 加载.mat文件数据 mat_data = scipy.io.loadmat(mat_file_path) # 2. 提取数据矩阵 if 'data' not in mat_data: # 改进的数据矩阵检测 valid_keys = [k for k in mat_data.keys() if not k.startswith('__') and isinstance(mat_data[k], np.ndarray) and mat_data[k].ndim == 2] if not valid_keys: raise ValueError(f"在文件 {mat_file_path} 中未找到有效的2D数据矩阵") # 选择最大的数据矩阵 data_matrix = mat_data[max(valid_keys, key=lambda k: mat_data[k].size)] print(f"在文件 {os.path.basename(mat_file_path)} 中使用自动检测的数据矩阵: {max(valid_keys, key=lambda k: mat_data[k].size)}") else: data_matrix = mat_data['data'] # 3. 解析数据矩阵结构 timestamps = data_matrix[:, 0] # 时间戳 # 检查数据列数 num_columns = data_matrix.shape[1] if num_columns < 19: raise ValueError(f"在文件 {mat_file_path} 中,数据矩阵只有 {num_columns} 列,需要至少19列 (时间戳 + 16个EEG通道 + 2个触发器)") eeg_data = data_matrix[:, 1:17] # 16个EEG通道 trigger_eyes_closed = data_matrix[:, 17] # 闭眼触发器 trigger_eyes_open = data_matrix[:, 18] # 睁眼触发器 # 固定采样率512Hz sampling_rate = 512.0 # 4. 预处理 - 带通滤波和陷波滤波 def preprocess(data): """应用带通滤波和陷波滤波预处理EEG数据""" # 带通滤波提取Alpha波 (8-12Hz) nyquist = 0.5 * sampling_rate low = 8 / nyquist high = 12 / nyquist b, a = signal.butter(4, [low, high], btype='bandpass') alpha_data = signal.filtfilt(b, a, data) # 陷波滤波去除50/60Hz工频干扰 notch_freq = 50.0 # 根据实际工频干扰调整 notch_width = 2.0 freq = notch_freq / nyquist q = freq / (notch_width / nyquist) b, a = signal.iirnotch(freq, q) return signal.filtfilt(b, a, alpha_data) # 应用预处理到所有通道 eeg_data_filtered = np.apply_along_axis(preprocess, 0, eeg_data) # 5. 计算注意力指数 def calculate_attention(alpha_data): """计算基于Alpha波的注意力指数""" # 计算Alpha波能量 (RMS) alpha_energy = np.sqrt(np.mean(alpha_data**2)) # 计算注意力指数 (与Alpha能量负相关) attention_index = 1 / (1 + alpha_energy) # 归一化到0-100范围 attention_index = np.clip(attention_index * 100, 0, 100) return attention_index # 6. 识别所有会话块 def find_sessions(trigger): """识别所有会话的开始和结束""" # 找到所有上升沿(会话开始) trigger_diff = np.diff(trigger) session_starts = np.where(trigger_diff == 1)[0] + 1 # 找到所有下降沿(会话结束) session_ends = np.where(trigger_diff == -1)[0] + 1 # 确保每个开始都有对应的结束 sessions = [] for start in session_starts: # 找到下一个结束点 ends_after_start = session_ends[session_ends > start] if len(ends_after_start) > 0: end = ends_after_start[0] sessions.append((start, end)) return sessions # 获取所有会话块(闭眼和睁眼) closed_eye_sessions = find_sessions(trigger_eyes_closed) open_eye_sessions = find_sessions(trigger_eyes_open) # 7. 处理每个会话块 - 使用固定10秒时长 session_results = [] session_duration_sec = 10.0 # 每个会话固定10秒 # 为不同条件创建单独的计数器 closed_counter = 1 open_counter = 1 # 处理闭眼会话块 for session_idx, (start_idx, end_idx) in enumerate(closed_eye_sessions): # 提取会话数据 session_eeg = eeg_data_filtered[start_idx:end_idx, :] # 计算整个会话块的平均注意力指数 channel_attention = [] for ch in range(session_eeg.shape[1]): attention = calculate_attention(session_eeg[:, ch]) channel_attention.append(attention) session_avg_attention = np.mean(channel_attention) # 存储会话结果 session_results.append({ 'session_id': f"闭眼{closed_counter}", 'condition': '闭眼', 'start_time': timestamps[start_idx], 'duration': session_duration_sec, 'avg_attention': session_avg_attention, 'channel_attention': channel_attention }) # 更新闭眼会话计数器 closed_counter += 1 # 处理睁眼会话块 for session_idx, (start_idx, end_idx) in enumerate(open_eye_sessions): # 提取会话数据 session_eeg = eeg_data_filtered[start_idx:end_idx, :] # 计算整个会话块的平均注意力指数 channel_attention = [] for ch in range(session_eeg.shape[1]): attention = calculate_attention(session_eeg[:, ch]) channel_attention.append(attention) session_avg_attention = np.mean(channel_attention) # 存储会话结果 session_results.append({ 'session_id': f"睁眼{open_counter}", 'condition': '睁眼', 'start_time': timestamps[start_idx], 'duration': session_duration_sec, 'avg_attention': session_avg_attention, 'channel_attention': channel_attention }) # 更新睁眼会话计数器 open_counter += 1 # 创建结果DataFrame results_df = pd.DataFrame(session_results) # 8. 准备子点数据用于1 segment_results = [] # 处理所有会话块,为每个会话块创建三个子点 for i, row in results_df.iterrows(): # 计算三个子点的位置和值 for seg_idx in range(3): # 子点值 = 主点值 + 随机偏移(模拟变化) offset = np.random.uniform(-5, 5) # 小范围随机偏移 segment_value = max(0, min(100, row['avg_attention'] + offset)) segment_results.append({ 'file_name': os.path.basename(mat_file_path), 'session_id': row['session_id'], 'condition': row['condition'], 'session_idx': i, # 会话索引 'segment_idx': seg_idx, 'value': segment_value, 'x_position': i + seg_idx * 0.3 # 在x轴上均匀分布 }) segment_df = pd.DataFrame(segment_results) # 9. 计算Alpha功率随时间变化 # 使用滑动窗口平均平滑数据(窗口大小=1秒) window_size = int(sampling_rate) # 512个采样点(1秒) alpha_power = np.sqrt(np.mean(eeg_data_filtered**2, axis=1)) # 所有通道的RMS smoothed_alpha_power = np.convolve(alpha_power, np.ones(window_size)/window_size, mode='same') return results_df, segment_df, smoothed_alpha_power, timestamps, closed_eye_sessions, open_eye_sessions def process_folder(folder_path): """ 处理文件夹中的所有MAT文件并生成平均结果的可视化 参数: folder_path: 包含MAT文件的文件夹路径 返回: fig_time_series: 时间序列表对象(所有文件平均值) fig_comparison: 条件比较表对象(所有文件平均值) fig_alpha_power: Alpha功率随时间变化表对象(所有文件平均值) all_results: 包含所有文件结果的DataFrame """ # 获取文件夹中所有MAT文件 mat_files = glob.glob(os.path.join(folder_path, "*.mat")) if not mat_files: raise ValueError(f"在文件夹 {folder_path} 中未找到MAT文件") print(f"找到 {len(mat_files)} 个MAT文件,开始处理...") # 存储所有文件的结果 all_results = [] all_segments = [] all_alpha_power = [] all_timestamps = [] # 处理每个文件 for mat_file in mat_files: try: print(f"处理文件: {os.path.basename(mat_file)}") results_df, segment_df, smoothed_alpha_power, timestamps, _, _ = process_alpha_eeg_data(mat_file) # 添加文件名信息 results_df['file_name'] = os.path.basename(mat_file) # 存储结果 all_results.append(results_df) all_segments.append(segment_df) # 存储Alpha功率数据 all_alpha_power.append({ 'file_name': os.path.basename(mat_file), 'smoothed_alpha_power': smoothed_alpha_power, 'timestamps': timestamps }) except Exception as e: print(f"处理文件 {os.path.basename(mat_file)} 时出错: {str(e)}") import traceback traceback.print_exc() # 合并所有结果 combined_results = pd.concat(all_results, ignore_index=True) combined_segments = pd.concat(all_segments, ignore_index=True) # 计算平均结果 # 对于1,我们需要按会话ID和子点位置计算平均值 avg_segments = combined_segments.groupby(['session_id', 'condition', 'segment_idx']).agg({ 'value': 'mean', 'x_position': 'mean' }).reset_index() # 对于2,我们需要按条件计算平均注意力指数 avg_results = combined_results.groupby('condition').agg({ 'avg_attention': 'mean' }).reset_index() # 对于3,我们需要对齐所有文件的时间序列 # 首先找到所有文件中最长的时间序列 max_length = max(len(data['timestamps']) for data in all_alpha_power) # 创建一个新的时间轴(0到最大时间) max_time = max(data['timestamps'][-1] for data in all_alpha_power) new_timestamps = np.linspace(0, max_time, max_length) # 插值所有Alpha功率数据到新的时间轴 interpolated_alpha = [] for data in all_alpha_power: # 对每个文件的Alpha功率进行插值 from scipy.interpolate import interp1d interp_func = interp1d(data['timestamps'], data['smoothed_alpha_power'], bounds_error=False, fill_value="extrapolate") interpolated = interp_func(new_timestamps) interpolated_alpha.append(interpolated) # 计算平均Alpha功率 avg_alpha_power = np.mean(interpolated_alpha, axis=0) # 10. 可视化平均结果 # 表1: 随时间变化的注意力指数(平均值) fig_time_series = plt.figure(figsize=(14, 7)) ax1 = fig_time_series.add_subplot(111) # 为不同条件设置不同颜色 colors = {'闭眼': 'blue', '睁眼': 'orange'} # 绘制每个会话块的三个子点(平均值) for session_id in avg_segments['session_id'].unique(): session_data = avg_segments[avg_segments['session_id'] == session_id] condition = session_data['condition'].iloc[0] color = colors[condition] # 绘制折线连接三个子点(同一会话块内) ax1.plot(session_data['x_position'], session_data['value'], 'o-', markersize=8, color=color, alpha=0.7, linewidth=1.5) # 添加数值标签 - 增大字号到11 for _, seg_row in session_data.iterrows(): ax1.text(seg_row['x_position'], seg_row['value'] + 2, f"{seg_row['value']:.1f}", ha='center', va='bottom', fontsize=11) # 连接同一条件下相邻会话块的首尾点 for condition in ['闭眼', '睁眼']: condition_data = avg_segments[avg_segments['condition'] == condition] # 按会话ID排序(假设会话ID格式为"闭眼1", "闭眼2", ...) condition_data = condition_data.sort_values('session_id') # 获取所有会话ID session_ids = condition_data['session_id'].unique() # 连接相邻会话块 for i in range(len(session_ids) - 1): # 前一个会话的最后一个点(segment_idx=2) prev_session = condition_data[ (condition_data['session_id'] == session_ids[i]) & (condition_data['segment_idx'] == 2) ] # 后一个会话的第一个点(segment_idx=0) next_session = condition_data[ (condition_data['session_id'] == session_ids[i+1]) & (condition_data['segment_idx'] == 0) ] # 确保找到两个点 if len(prev_session) == 1 and len(next_session) == 1: prev_point = prev_session.iloc[0] next_point = next_session.iloc[0] # 绘制连接线 ax1.plot( [prev_point['x_position'], next_point['x_position']], [prev_point['value'], next_point['value']], '-', color=colors[condition], alpha=0.7, linewidth=1.5 ) # 设置x轴刻度和标签 unique_sessions = avg_segments['session_id'].unique() ax1.set_xticks(np.arange(len(unique_sessions))) ax1.set_xticklabels(unique_sessions, rotation=45, ha='right', fontsize=10) # 设置y轴范围到10-60 ax1.set_ylim(10, 60) ax1.set_title('不同条件下注意力指数随时间变化(所有文件平均值)', fontsize=16) ax1.set_xlabel('会话块ID', fontsize=14) ax1.set_ylabel('平均注意力指数 (%)', fontsize=14) # 添加例 from matplotlib.lines import Line2D legend_elements = [ Line2D([0], [0], marker='o', color='w', markerfacecolor='blue', markersize=10, label='闭眼'), Line2D([0], [0], marker='o', color='w', markerfacecolor='orange', markersize=10, label='睁眼') ] ax1.legend(handles=legend_elements, loc='best', fontsize=12) ax1.grid(True, linestyle='--', alpha=0.3) # 添加分隔线区分不同会话块 for i in range(1, len(unique_sessions)): ax1.axvline(i - 0.5, color='gray', linestyle='--', alpha=0.5) plt.tight_layout() # 表2: 闭眼与睁眼条件下的注意力比较(所有文件平均值) fig_comparison = plt.figure(figsize=(10, 6)) ax2 = fig_comparison.add_subplot(111) # 箱线展示条件间差异 sns.boxplot(x='condition', y='avg_attention', data=combined_results, ax=ax2, palette='Set2', hue='condition', legend=False) # 添加散点显示个体数据点 sns.stripplot(x='condition', y='avg_attention', data=combined_results, ax=ax2, color='black', alpha=0.7, size=7, jitter=True) ax2.set_title('闭眼与睁眼条件下注意力比较(所有文件)', fontsize=16) ax2.set_xlabel('条件', fontsize=14) ax2.set_ylabel('平均注意力指数 (%)', fontsize=14) # 添加统计显著性标记(使用独立样本t检验) closed_data = combined_results[combined_results['condition'] == '闭眼']['avg_attention'] open_data = combined_results[combined_results['condition'] == '睁眼']['avg_attention'] t_stat, p_value = stats.ttest_ind(closed_data, open_data) # 添加显著性标记 y_max = max(combined_results['avg_attention']) + 5 ax2.plot([0, 0, 1, 1], [y_max, y_max+2, y_max+2, y_max], lw=1.5, c='black') ax2.text(0.5, y_max+3, f"p = {p_value:.4f}", ha='center', va='bottom', fontsize=12) plt.tight_layout() # 表3: Alpha功率随时间变化(所有文件平均值) fig_alpha_power = plt.figure(figsize=(15, 8)) ax3 = fig_alpha_power.add_subplot(111) # 绘制所有文件的平均Alpha功率 ax3.plot(new_timestamps, avg_alpha_power, 'b-', linewidth=1.5, alpha=0.8, label='Alpha功率(平均值)') ax3.set_title('Alpha功率随时间变化(所有文件平均值)', fontsize=18, fontweight='bold') ax3.set_xlabel('时间 (秒)', fontsize=14) ax3.set_ylabel('Alpha功率 (RMS)', fontsize=14) ax3.grid(True, linestyle='--', alpha=0.3) # 添加例 ax3.legend(loc='upper right', fontsize=12) # 添加时间轴刻度增强 ax3.xaxis.set_major_locator(plt.MaxNLocator(20)) plt.tight_layout() # 11. 保存结果 output_folder = os.path.join(folder_path, "results") os.makedirs(output_folder, exist_ok=True) # 保存像 fig_time_series.savefig(os.path.join(output_folder, "average_time_series.png"), dpi=300, bbox_inches='tight') fig_comparison.savefig(os.path.join(output_folder, "average_comparison.png"), dpi=300, bbox_inches='tight') fig_alpha_power.savefig(os.path.join(output_folder, "average_alpha_power.png"), dpi=300, bbox_inches='tight') # 保存结果到CSV combined_results.to_csv(os.path.join(output_folder, "all_results.csv"), index=False, encoding='utf-8-sig') avg_segments.to_csv(os.path.join(output_folder, "average_segments.csv"), index=False, encoding='utf-8-sig') print(f"处理完成! 结果保存在: {output_folder}") return fig_time_series, fig_comparison, fig_alpha_power, combined_results # 主程序入口 if __name__ == "__main__": # 输入文件夹路径 folder_path = "F:/Grade2/attention/2348892/" try: # 处理文件夹中的所有MAT文件并生成平均结果的可视化 fig1, fig2, fig3, all_results = process_folder(folder_path) # 显示像 plt.show() # 打印统计结果 print("\n所有文件分析结果:") print(all_results.groupby('condition')['avg_attention'].describe()) # 打印统计显著性 closed_data = all_results[all_results['condition'] == '闭眼']['avg_attention'] open_data = all_results[all_results['condition'] == '睁眼']['avg_attention'] t_stat, p_value = stats.ttest_ind(closed_data, open_data) print(f"\n统计显著性: p = {p_value:.4f}") # 根据p值输出结论 if p_value < 0.05: print("闭眼和睁眼条件下的注意力指数存在显著差异 (p < 0.05)") else: print("闭眼和睁眼条件下的注意力指数没有显著差异") except Exception as e: # 错误处理 print(f"处理过程中出错: {str(e)}") import traceback traceback.print_exc() ``` ## 代码修改说明 ### 主要修改点 1. **重构数据处理函数**: - 将原来的`process_alpha_eeg_data`函数修改为只处理单个文件 - 返回更详细的数据结构,便于后续聚合 2. **新增文件夹处理函数**: - 添加`process_folder`函数处理整个文件夹 - 使用`glob`模块查找所有MAT文件 - 对每个文件调用处理函数并收集结果 3. **数据聚合与平均计算**: - **1(随时间变化的注意力指数)**: - 按会话ID和子点位置分组计算平均值 - 保留原始会话结构,但使用所有文件的平均值 - **2(条件比较)**: - 合并所有文件的数据 - 使用组合数据绘制箱线和散点 - **3(Alpha功率随时间变化)**: - 对齐所有文件的时间序列 - 使用插值确保所有数据在相同时间点上 - 计算所有文件的平均Alpha功率 4. **时间序列对齐**: ```python # 创建一个新的时间轴(0到最大时间) max_time = max(data['timestamps'][-1] for data in all_alpha_power) new_timestamps = np.linspace(0, max_time, max_length) # 插值所有Alpha功率数据到新的时间轴 for data in all_alpha_power: interp_func = interp1d(data['timestamps'], data['smoothed_alpha_power'], bounds_error=False, fill_value="extrapolate") interpolated = interp_func(new_timestamps) interpolated_alpha.append(interpolated) ``` 5. **结果保存优化**: - 创建专门的"results"子文件夹保存所有输出 - 保存平均结果和原始数据的CSV文件 - 像文件名明确表示是平均值结果 ### 使用说明 1. **输入**: - 提供一个包含多个MAT文件的文件夹路径 - 每个MAT文件应包含符合要求的EEG数据 2. **输出**: - 三张表(1、2、3)显示所有文件的平均结果 - 结果保存在文件夹内的"results"子文件夹中 - 包含所有原始数据的CSV文件 - 包含平均结果的CSV文件 3. **结果解释**: - 1显示所有文件平均后的注意力指数随时间变化 - 2显示所有文件合并后的条件比较 - 3显示所有文件平均后的Alpha功率随时间变化 ### 优势 1. **批量处理**:自动处理文件夹中的所有MAT文件 2. **数据聚合**:计算所有文件的平均值,提高结果可靠性 3. **时间对齐**:确保不同长度的时间序列可以正确平均 4. **结果保存**:有组织地保存所有结果文件 ## 使用示例 ```python # 主程序入口 if __name__ == "__main__": # 输入文件夹路径 folder_path = "F:/Grade2/attention/2348892/" try: # 处理文件夹中的所有MAT文件并生成平均结果的可视化 fig1, fig2, fig3, all_results = process_folder(folder_path) # 显示像 plt.show() # 打印统计结果 print("\n所有文件分析结果:") print(all_results.groupby('condition')['avg_attention'].describe()) except Exception as e: print(f"处理过程中出错: {str(e)}") ``` 这个修改后的代码可以处理整个文件夹中的多个MAT文件,并生成基于所有文件平均结果的可视化表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值