使用单选按钮面板选择不同的图形选项

时间:2009-07-20 19:54:49

标签: matlab radio-button

我正在尝试创建一个GUI,它将接受多个输入并通过多个函数运行它们。我希望使用单选按钮面板在不同的图形之间切换,但我似乎无法让它工作。以下是我的代码示例。

switch get(eventdata.NewValue,'Tag')   % Get Tag of selected object
    case 'button1'
        status1 = str2double(get(handles.button1,'Value'));
        if status1 == 1;
            axes(handles.axes1)

            grid on;
            plot(x1,y1)

        end
    case 'button2'
        status2 = str2double(get(handles.button2,'Value'));
        if status2 == 1;
            axes(handles.axes1)

            grid on;
            plot(x2,y2)
        end

    case 'button3'
        status3 = str2double(get(handles.button3,'Value'));
        if status3 ==1
            plot(x3,y3)
        end

    otherwise
        % Code for when there is no match.

end

2 个答案:

答案 0 :(得分:1)

您似乎试图以与radio button panel类似的方式创建this example tutorial on blinkdagger.com。具体来说,我相信您正在尝试创建SelectionChangeFcn来定义单选按钮如何修改GUI。我建议如下:

首先,我建议您在创建GUI时绘制所有线条,然后将线条的“可见”属性调整为“打开”或者不是在每次选择单选按钮时重新绘制一条线。 'off'取决于选择的按钮。创建GUI时,可以在代码中的某处添加这些行(在创建轴并将其放在handles变量中之后):

handles = guidata(hObject);  % Retrieve handles structure for GUI
set(handles.axes1,'NextPlot','add');  % Set axes to allow multiple plots
lineHandles = [plot(handles.axes1,x1,y1,'Visible','off') ...
               plot(handles.axes1,x2,y2,'Visible','off') ...
               plot(handles.axes1,x3,y3,'Visible','off')];
handles.lineHandles = lineHandles;  % Update handles structure
guidata(hObject,handles);  % Save handles structure

这将在同一轴上绘制三组线。这些线最初不可见,并且每个绘制线的句柄都收集在矢量变量lineHandles中。上面的最后两行将句柄添加到句柄结构并更新GUI数据(hObject应该是GUI图窗口的句柄!)。

现在,您可以将以下内容用于SelectionChangeFcn:

handles = guidata(hObject);  % Retrieve handles structure for GUI
buttonTags = {'button1' 'button2' 'button3'};
if ~isempty(eventdata.OldValue),          % Check for an old selected object
  oldTag = get(eventdata.OldValue,'Tag'),   % Get Tag of old selected object
  index = strcmp(oldTag,buttonTags);     % Find index of match in buttonTags
  set(handles.lineHandles(index),'Visible','off');       % Turn old line off
end
newTag = get(eventdata.NewValue,'Tag'),   % Get Tag of new selected object
index = strcmp(newTag,buttonTags);     % Find index of match in buttonTags
set(handles.lineHandles(index),'Visible','on');         % Turn new line on
guidata(hObject,handles);  % Save handles structure

注意:如果您想要更改绘制的三行中的任何一行,只需设置其中一个行句柄的“XData”和“YData”属性即可。例如,这会使用新的x和y数据更新第一个绘制的线:

set(handles.lineHandles(1),'XData',xNew,'YData',yNew);

答案 1 :(得分:0)

除非你有充分的理由不这样做,否则我认为你应该将绘图代码放在每个单选按钮的回调中。

无需做这个大型开关站。

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

% Hint: get(hObject,'Value') returns toggle state of radiobutton1
%%
%get the values of x y into this callback as you see fit
plot(x,y)

此外,按钮出来的'值'已经是单选按钮的两倍。无需像你一样进行转换。