matlab批量处理excel数据,绘图并保存

背景:

近期做实验需要处理大量的.dat格式数据,文件内容格式相同,生成折线图并保存图片。

思路:

1. 新建文件夹dat_in,存放待处理数据文件

matlab批量处理excel数据,绘图并保存_第1张图片

2. 循环读取文件名,放入元胞数组

3. 按文件名循环处理数据,每个文件处理流程如下

3.1 根据数据标识去除无效数据

matlab批量处理excel数据,绘图并保存_第2张图片

3.2 读取待处理数据,存入二维数组

3.3 数据运算,绘图

3.4 新建文件夹dat_image,以文件名变量命名另存图片,效果如下

matlab批量处理excel数据,绘图并保存_第3张图片

 

代码实现:

close all
clear all
clc

%———另一种文件名加载到元胞数组方法———————————
% path = '.\dat_in\';%添加数据文件夹相对路径
% list = dir([path,'*.dat']); %读取path路径下所有dat格式文件

% filename = cell(length(list),1);%创建length(list)*1的元胞数组,即length(list)行,1列
% for ii = 1:length(list)         %将path文件夹内的所有dat格式文件的文件名放入filename()
% filename(ii) = {list(ii).name};
% end

% FN = cell2mat(filename(8));
%—————————————————————————————


%———将数据文件名添加到元胞数组,对文件夹内所有.dat文件进行数据处理——
path = '.\dat_in\';     %添加数据文件夹相对路径,文件夹在.m文件夹中
list = dir([path,'*.dat']);     %读取path路径下所有dat格式文件
fileNames={list.name};     %将数据文件名添加到元胞数组


for i = 1:length(fileNames)         %加载数据,放入矩阵data_in数组
    data_in = load(fileNames{i});      
    %———判断前k行属于无用数据———————————
    reference = data_in(:, 7);      %加载第7列数据,寻找标志位,记录标志位行数k
    for k = 1:length(reference)
        x(k) = reference(k);
        if x(k) ~= 0
            break;
        end
    end
    k = k-2;
    disp(k);
    
    %————————数据处理——————————————————————
    D = data_in(:, [2 3 5 4 7 8]);      %将2 3 5 4 7 8列数据按顺序存入矩阵D
    D(1:k,:) = [];      %去除前k行无效数据
    hmax = length(D);
    
    m1R = D(:, 1);      %电机1实际轨迹
    m2R = D(:, 2);      %电机2实际
    j5R = D(:, 3);      %关节5实际
    j6R = D(:, 4);      %关节6实际
    m1P = D(:, 5);      %电机1规划
    m2P = D(:, 6);      %电机2规划
    
    j5P = (m1P + m2P)/2;        
    j5R1 = j5R(1);
    
    j5P2 = (m1R + m2R)/2;       
    j5CE = j5P2 - j5R + j5R1;
    
    j6P = (m2P - m1P)/2;        
    j6R1 = j6R(1);
    
    j6P2 = (m2R - m1R)/2;       
    j6CE = j6P2 - j6R + j6R1;
       
    %————————出图—————————————————
    % figure1
    set(gcf,'Position',[200 200 1080 720]);     %gcf,返回Figure句柄值,[图表左下角横坐标,左下角纵坐标,宽,高],单位像素
    set(gca,'Position',[0.08 0.08 0.84 0.85]);      %图表占比,同上,相对比例
    plot(j5CE,'g','linewidth',1);       %打印曲线1,颜色green,线宽1


    ax = gca;       %坐标轴设置和原点重合
    ax.XAxisLocation = 'origin';
    ax.YAxisLocation = 'origin';


    xlabel('时间(×0.004s)','fontname','微软雅黑','fontsize',14,'FontWeight','bold','Color','r');      %横轴标签,字号,字体,颜色
    ylabel('误差(度)','fontname','微软雅黑','fontsize',14,'FontWeight','bold','Color','r');
    % set(gca,'YTick',[-10:1:3]);       %设置y轴[起值,间隔,终值],gca,返回axis对象的句柄值
    %h = annotation('textarrow',[0.6 0.4],[0.2 0.185],'Color','r','headsize',5);        %箭头,[x起 x终][y起 y终],headsize箭头大小
    %set(h,'string','误差最大值-8°','fontsize',12);      %箭头注释,颜色随箭头
    title([fileNames{i} '关节误差曲线'],'fontsize',18,'fontweight','bold','fontname','微软雅黑','Color','r');
    %text(j5CEmax,0,'\leftarrow 误差最小值');
    % legend('j5CE','fontsize',10,'FontWeight','bold','Color',[0.9 0.9 0.9]);       %颜色可以用rgb值,也可以用字母简写
    hold on;
    plot(j6CE,'r','linewidth',1);       %曲打印曲线2
    legend('j5CE','j6CE','fontsize',10,'FontWeight','bold','Color',[0.9 0.9 0.9]);      %曲线标签,颜色可以用rgb值,也可以用字母
    hold off;
    pause(2);       %图表保持显示2秒
    
    %————————存图————————————————
    mkdir dat_image;     %新建dat_image文件夹,如存在会警告,不影响程序
    filepath=pwd;           %保存当前工作目录
    cd('dat_image');        %把当前工作目录切换到指定文件夹


    % saveas(gcf,[fileNames{i} '.png']);        %存图方法一


    f = getframe(gcf);      %存图方法二
    imwrite(f.cdata,[fileNames{i} '传动误差.png']);     %将fileNames{i} 变量写入文件名
    cd(filepath);          %返回工作目录
    
end;       %.dat文件处理for循环尾  
close;      %关闭所有图表

其他:

程序多次执行可能会造成.dat文件乱码(一般是第二个文件),原因未知。建议另存一份,如乱码替换后重新执行。

你可能感兴趣的:(matlab)