您的位置:首页 > 编程语言 > MATLAB

Matlab GUI入门-直方分布图界面制作

2020-05-09 04:16 2779 查看

前言

制作gui界面,根据输入两个整数,画直方图。直方图的直方数和随机数的个数由界面输入;随机数的类型请用radiobutton控制,至少给出三种随机数组合。

入门系列一从界面到功能具体实现详细下戳
Matlab GUI入门-文件显示界面制作

实操

1.step 1 构建图形的初始页面,颜色、字体大小可以双击 打开属性页面设置 自己选择

2.功能部分。
对功能进行分析。
(1)输入参数后,点击确定之后,直方分布图绘制在画布上
(2)输入参数后,点击取消后重置参数。

大致点击“确定” 按钮,右键进入回调(查看回调-callback),搭建初步实现框架,再去补其他具体模块实现。
还是同上面思路一样,通过捕获异常 输出 参数无效值的设置

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

%设置全局变量来记录是否显示过绘图
global draw
draw=0
try
%获得直方数
num=get(handles.edit1,'string')
num=str2num(num)
%获得随机数个数
rand_num=get(handles.edit2,'string')
rand_num=str2num(rand_num)

%这里的设置是因为一开始运行的时候,单选默认是“均匀分布”,至于你的“均匀分布”的Tag是什么要具体修改
try
a=handles.str_button %如果点击了按钮组的选项,这里不会报错 因此可以直接获得
catch exception
%报错了是因为没有点击按钮选项,按照初始的默认选择。报错的原因要具体看我下面按钮组的设置模块部分是怎么写的。因为,我没有给按钮们设置value
a='radiobutton1'%查看对应的tag ,这里进行修改
end

%判断单选按钮,对应随机数产生方法
switch a
case 'radiobutton1'%均匀分布(设计框架时,只需在下面写do somthing)
%判断是否输入生成范围
% b=size(get(handles.edit3,'string'))
% assignin('base','size',b) %方便在工作区监控变量的指令)
size1=size(get(handles.edit3,'string'))
size2=size(get(handles.edit4,'string'))
if (size1(2)>0) & (size(2)>0) %这是我判断不会输出空字符串不会报错的方法了。如果直接==''这样,对于有字符输入,会报错:维度不一致
min=get(handles.edit3,'string')
max=get(handles.edit4,'string')
min=str2num(min)
max=str2num(max)
if min==max %输入的范围不能相等
throw(exception) %扔出一个异常,被首级的try..catch.. 捕获,执行首级的命令。
%要看清try...catch... 的分级
end
else
%默认设置
min=0
max=1
end
assignin('base','max',max)
R=min+(max-min).*rand(rand_num,1)%[20-100] %均匀分布
case 'radiobutton2'
%下面分析和上面雷同,正态分布
size1=size(get(handles.edit7,'string'))
size2=size(get(handles.edit8,'string'))
if (size1(2)>0) & (size(2)>0)
mean=get(handles.edit7,'string')
standard_deviation=get(handles.edit8,'string')
mean=str2num(mean)
standard_deviation=str2num(standard_deviation)
else
mean=0
standard_deviation=1
end
assignin('base','mean',mean)
assignin('base','standard',standard_deviation)
%from a normal distribution with mean 1 and standard deviation 2.
%r = 1 + 2.*randn(100,1);
R=mean+standard_deviation.*randn(rand_num,1);%正态分布,均值为0,方差为1
case 'radiobutton3'
%do something 泊松分布
lam=70
R=poissrnd(lam,rand_num,1);
case 'radiobutton4'
%do something 几何分布
size1=size(get(handles.edit6,'string'))
if size1(2)>0
p=get(handles.edit6,'string')
p_=str2num(p)
%                 assignin('base','p_',p_)
if p_>100|p_<1
%                     ME=MException('myfun:valid value','value %s is valid',p)
%                     throw(ME) %这里是自定义异常,并抛出,后来没有用到
throw(exception)
else
p_=p_/100
R=geornd(p_,rand_num,1)
end
else
throw(exception)
end
case 'radiobutton5'
%do something 二项分布
size1=size(get(handles.edit6,'string'))
if size1(2)>0
p=get(handles.edit6,'string')
p_=str2num(p)
assignin('base','p_',p_)
if p_>100|p_<1
throw(exception)
else
p_=p_/100
R=binornd(50,p_,rand_num,1);
end
else
throw(exception)
end
end
%绘制直方分布图
axes(handles.axes1)
hist(R,num)
draw=draw+1
catch exception
warndlg('输入了无效值,请重新输入','warning string')
end

小总结:

  1. 各种分布的使用方法
    用matlab生成各种分布的随机数并做直方图
  2. 异常处理
    引发异常
    捕获异常

(2)多个单选按钮的设置
两个思路:
1.通过设置按钮组的回调函数
2.通过设置所有的按钮 的 回调函数
下面的例子讲的非常详细:
MATLAB中的单选按钮和按钮组
下面我是通过第一个思路设置

% --- Executes when selected object is changed in uibuttongroup2.
function uibuttongroup2_SelectionChangedFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in uibuttongroup2
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

%方法二
%这里代码解释了上面为什么要异常处理,如果是默认选择而不点击,根本就不会进入这个响应函数,相应的handles 里面 就没有 str_button 这个属性
handles.str_button=get(hObject,'tag')

%保存数据
guidata(hObject,handles)

(3)取消置数

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.edit1,'string','') %设置空值的方法
set(handles.edit2,'string','')
set(handles.edit3,'string','')
set(handles.edit4,'string','')
set(handles.edit7,'string','')
set(handles.edit8,'string','')
set(handles.edit6,'string','')
set(handles.radiobutton1,'value',1)%使能当前

最终效果(分布图展示 和 数据异常报错)


尽管代码可能写的有些累赘,如果有更好的方法,更简洁的代码实现可以讨论区交流~

爪哇 o_O 原创文章 6获赞 9访问量 1001 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: