今天,小编将带你做一个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