Matlab中从两子文件夹绘图至同一画布及下拉选择实现问询
处理Matlab多文件夹数据绘图与组织问题
背景
需要处理两个子文件夹下的txt数据,路径如下:
C:\Users\Name\OneDrive\Desktop\Outputs\Data\Phase1\out\StatsC:\Users\Name\OneDrive\Desktop\Outputs\Data\Phase2\out\Stats
每个Stats文件夹内有10个编号1到10的txt文件,同编号文件维度一致。需求是将两个文件夹中的同编号文件(如1.txt)绘制在同一图中,图例分别标注为Phase1和Phase2。目前使用fileDatastore读取后得到20×1的表格元胞数组,用cellfun逐次绘图,遇到以下疑问:
疑问点
- Phase与Stats文件夹之间存在
out子文件夹,是否应将Stats移至对应Phase子文件夹下操作(out中还有其他文件)? - 后续需实现下拉选择功能:用户选择如
3.txt,即可绘制所有Phase下该文件的共同变量。 - 当前无法按文件夹组织数据(期望为2×1元胞数组,每行含10×1表格数组),且修改图例时会加载完整路径遮挡绘图区域。
当前代码
Folders = dir(fullfile("C:\Users\NamE\OneDrive\Desktop\Files\Data\*\*\***\Stats\","*.txt")); Folders = Folders(~ismember({Folders.name},{'.','..'})); Folders_Data = struct2cell(Folders); Folders_Data = transpose(Folders_Data); Files_Data = struct2cell(Folders); Files_Data = transpose(Files_Data); Files_Data = Files_Data(:,2); Files_Data = unique(Files_Data); fds = fileDatastore(Files_Data, ReadFcn=@(x) readtable(x,VariableNamingRule="preserve"), FileExtensions=".txt", IncludeSubfolders=true, ReadMode="file"); data = readall(fds)
解决方案
1. 文件夹结构处理
不需要移动Stats文件夹,通过路径解析直接定位目标文件即可,避免破坏原有文件结构。可以通过提取路径中的Phase标识来分类数据。
2. 数据组织与下拉选择实现
以下代码会将数据按Phase组织成期望的2×1元胞结构,同时实现下拉选择绘图功能:
% 定义根路径 rootPath = "C:\Users\Name\OneDrive\Desktop\Outputs\Data\"; % 获取所有Stats文件夹下的txt文件 fileList = dir(fullfile(rootPath, 'Phase*\out\Stats\*.txt')); % 初始化数据结构:2×1元胞,每个元素对应一个Phase的10个表格 phaseData = cell(2,1); phaseNames = {'Phase1', 'Phase2'}; for i = 1:length(phaseNames) % 筛选当前Phase下的所有文件 phaseFiles = fileList(contains({fileList.folder}, phaseNames{i})); % 按文件编号(1-10)排序 fileNums = str2double(extractBefore({phaseFiles.name}, '.txt')); [~, sortIdx] = sort(fileNums); sortedPhaseFiles = phaseFiles(sortIdx); % 读取每个文件到表格数组 phaseData{i} = cellfun(@(f) readtable(fullfile(f.folder, f.name), ... VariableNamingRule="preserve"), sortedPhaseFiles, 'UniformOutput', false); end % 生成下拉菜单选项(1.txt到10.txt) fileOptions = arrayfun(@(x) sprintf('%d.txt', x), 1:10, 'UniformOutput', false); % 创建GUI下拉控件 uicontrol('Style','popupmenu','String',fileOptions,... 'Position',[20 20 100 20],'Callback',@plotSelectedFile); % 下拉选择的回调函数 function plotSelectedFile(src, ~) selectedIdx = src.Value; selectedFileName = src.String{selectedIdx}; figure; hold on; grid on; % 遍历两个Phase绘图 for phaseIdx = 1:length(phaseNames) tbl = phaseData{phaseIdx}{selectedIdx}; % 假设第一列为X轴,其余列为Y轴变量,可根据实际数据调整 xData = tbl{:,1}; for varIdx = 2:width(tbl) varName = tbl.Properties.VariableNames{varIdx}; plot(xData, tbl{:,varIdx}, 'DisplayName', sprintf('%s - %s', phaseNames{phaseIdx}, varName)); end end legend('Location','best'); % 自动选择最优图例位置 title(sprintf('Data Comparison: %s', selectedFileName)); end
3. 数据结构与图例优化
- 数据结构:上述代码将数据组织为2×1元胞数组,每个元胞内是对应Phase的10个表格(按文件编号排序),完全符合需求。
- 图例优化:通过提取Phase名称和表格变量名设置图例文本,避免使用完整路径;同时用
legend('Location','best')让Matlab自动选择图例位置,避免遮挡绘图区域。
内容的提问来源于stack exchange,提问作者Chaz69631
相关产品推荐
相关产品推荐

