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

Matlab中从两子文件夹绘图至同一画布及下拉选择实现问询

处理Matlab多文件夹数据绘图与组织问题

背景

需要处理两个子文件夹下的txt数据,路径如下:

  • C:\Users\Name\OneDrive\Desktop\Outputs\Data\Phase1\out\Stats
  • C:\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:33:26