以自相关性为例详解matlab GUI纯代码开发

2021-04-22 15:11:41 浏览数 (1)

今天,小编将带你做一个GUI小程序,用于“相关性图像自动绘制”,学习全文后,相信你能够入门Matlab GUI纯代码编程。首先,让我们看一下程序长什么样子。

Step1:创建界面

代码语言:javascript复制
global GUI
% 创建窗口
% figure('属性1',值.'属性2',值,...);
GUI.w1=figure('Name','MyFigure',...
    'Position',[481,196,483,329],...
    'Menubar','none',...
    'Numbertitle','off',...
    'tag','figure1');

% 创建菜单
GUI.m1=uimenu(GUI.w1,'label','打开','callback',@openfile);

% 创建控件
% uicontrol('属性1',值.'属性2',值,...);
GUI.btn1=uicontrol(GUI.w1,'Style','pushbutton','Position',[90,160,60,30],...
    'String','绘制','Fontsize',12,'callback',@drawimage,'tag','btn1');

% 创建坐标轴
% axes('属性1',值.'属性2',值,...);
GUI.Axes1=axes('Box','on','Units','points','Position',[140,30,200,200]);

% 创建callback
function drawimage(~,~)
    x=0:0.1:2*pi;
    plot(x,sin(x),'-r');
end

如上所示,创建窗口、控件的语法类似,参数均为“属性,值”,那么问题来了,我们如何知道窗口、控件的属性呢?方法1:删除掉代码中创建窗口的'Menubar,none'这一行,使菜单栏显示,运行程序,点击属性检查器后,选择相应控件即可,如下图。方法2:命令行输入guide,创建控件查看属性。

窗口、菜单、控件创建好了,接下来需要callback引入功能,如上代码,callback作为控件属性,其后@函数名即可完成绑定。

学习到这里,你可以做出本文介绍的GUI小程序的界面了

Step2:功能-打开文件

代码语言:javascript复制
% callback-打开图片
function openfile(~,~)
    global GUI
    [Filename,Pathname]=uigetfile({'*.txt';'*.xls';},'选择文件');
    str=[Pathname Filename];
    if (Filename~=0)
        GUI.data=load(str);
        msgbox('读取文件成功');
    else
        return;
    end
end

Step3:功能-导出高清图片

代码语言:javascript复制
% callback-导出图片
function savefile(~,~)
    global GUI
    h=figure;
    set(h,'Visible','off');
    h1=copyobj(GUI.Axes1,h);
    set(h1,'Units','default','Position','default');
    [fileName,pathName]=uiputfile({'*.jpg','JPEG(*.jpg)';},'save picture','Picture1');
    if fileName==0
        close(h);
        return;
    else
        print(strcat(pathName,fileName),h,'-r2000','-dtiffn');
        msgbox('保存文件成功');
    end
end

学习到这里,你可以为“打开”、“导出”两菜单添加功能了。

Step4:功能-美化图片

代码语言:javascript复制
% 创建并保存句柄结构(!!!)
handles=guihandles(GUI.w1); 
guidata(GUI.w1,handles); 

% callback-美化图片
function beautiful()  
   global GUI
   FontSize1=get(GUI.edit1,'string');
   FontSize1=str2double(FontSize1);

   S=guidata(gcbo); 
   S.Axes1.FontSize=FontSize1;
   S.Axes1.FontWeight='Bold';
   S.Axes1.Box='on';
   S.Axes1.LineWidth=1.5;
   S.Axes1.XGrid='on';
   S.Axes1.YGrid='on';
   S.Axes1.GridLineStyle='--';
   guidata(gcbo,S);
end

创建句柄结构后,需要为控件添加‘tag’属性以标识控件,否则

guidata(gcbo)将返回[];最后利用guidata(gcbo,S)把值传递回去,该例子体现的是GUI的数据传递。

step5:总结

下面我们将上面的程序汇总起来

代码语言:javascript复制
clear;clc;
global GUI
% 创建窗口
GUI.w1=figure('Name','MyFigure',...
    'Position',[481,196,483,329],...
    'Menubar','none',...
    'Numbertitle','off',...
    'tag','figure1');

% 创建菜单
GUI.m1=uimenu(GUI.w1,'label','打开','callback',@openfile);
GUI.m2=uimenu(GUI.w1,'label','导出','callback',@savefile);

% 创建控件
GUI.btn1=uicontrol(GUI.w1,'Style','pushbutton','Position',[90,160,60,30],...
    'String','绘制','Fontsize',12,'callback',@drawimage,'tag','btn1');
GUI.text1=uicontrol(GUI.w1,'Style','text','Position',[-20,250,90,30],...
    'String','字号:','FontSize',12,'tag','text1');
GUI.edit1=uicontrol(GUI.w1,'Style','edit','Position',[50,250,90,30],...
    'FontSize',12,'String',12,'tag','edit1','callback',@drawimage);
GUI.Axes1=axes('Box','on','Units','points','Position',[140,30,200,200],'tag','Axes1');

% 创建并保存句柄结构
handles=guihandles(GUI.w1); 
guidata(GUI.w1,handles); 

% callback-打开图片
function openfile(~,~)
    global GUI
    [Filename,Pathname]=uigetfile({'*.txt';'*.xls';},'选择文件');
    str=[Pathname Filename];
    if (Filename~=0)
        GUI.data=load(str);
        msgbox('读取文件成功');
    else
        return;
    end
end

% callback-导出图片
function savefile(~,~)
    global GUI
    h=figure;
    set(h,'Visible','off');
    h1=copyobj(GUI.Axes1,h);
    set(h1,'Units','default','Position','default');
    [fileName,pathName]=uiputfile({'*.jpg','JPEG(*.jpg)';},'save picture','Picture1');
    if fileName==0
        close(h);
        return;
    else
        print(strcat(pathName,fileName),h,'-r2000','-dtiffn');
        msgbox('保存文件成功');
    end
end

% callback-绘制图片
function drawimage(~,~)
    x=0:0.1:2*pi;
    plot(x,sin(x),'-r');
    beautiful;
end

% callback-美化图片
function beautiful()  
   global GUI
   FontSize1=get(GUI.edit1,'string');
   FontSize1=str2double(FontSize1);

   S=guidata(gcbo); 
   S.Axes1.FontSize=FontSize1;
   S.Axes1.FontWeight='Bold';
   S.Axes1.Box='on';
   S.Axes1.LineWidth=1.5;
   S.Axes1.XGrid='on';
   S.Axes1.YGrid='on';
   S.Axes1.GridLineStyle='--';
   guidata(gcbo,S);
end

step6:相关性图像绘制核心代码

代码语言:javascript复制
% callback-绘制图片
function draw_xg(varargin)
     global GUI
     cla(GUI.Axes1)
;
     %字号
     FontSize1=get(GUI.edit1,'string');
     FontSize1=str2double(FontSize1);
     %绘制散点
     x1=GUI.menu1.UserData(:,1);
     y1=GUI.menu1.UserData(:,2);
     plot(x1,y1,'.k');
     %计算拟合曲线
     axisx=get(gca,'Xlim'); 
     t=polyfit(x1,y1,1);
     k=t(1);
     b=t(2);
     x2=axisx(1):axisx(2);
     y2=k*x2 b;
     %绘制曲线
     hold on
     plot(x2,y2,'-r','LineWidth',2);
     %计算R
     t=corrcoef(x1,y1);
     R=t(1,2);
     %计算坐标范围
     axisx=get(gca,'Xlim'); 
     axisy=get(gca,'Ylim');
     %标注R
     text(axisx(2),axisy(2),['R=',num2str(R)],'HorizontalAlignment','right',...
         'VerticalAlignment','top','FontSize',FontSize1,'FontWeight','bold');
     hold off
     axis([axisx(1) axisx(2) axisy(1) axisy(2)])
     %美化
     beautiful
end

由于完整代码较长,这里就不贴了,回复关键字“相关性”即可得到网盘链接。

参考资料:

[1] https://www.ilovematlab.cn/thread-20398-1-1.html

[2] https://www.ilovematlab.cn/thread-30649-1-1.html

[3] https://www.ilovematlab.cn/thread-120650-1-1.html

[4] https://www.ilovematlab.cn/thread-63062-1-1.html

0 人点赞