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

前言

制作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)%使能当前

最终效果(分布图展示 和 数据异常报错)
在这里插入图片描述
在这里插入图片描述
尽管代码可能写的有些累赘,如果有更好的方法,更简洁的代码实现可以讨论区交流~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章