MatLab - 使用GUI滑块控制图中的标记

时间:2015-01-10 18:33:40

标签: matlab figure

我正在尝试使用代表markeraxes坐标的2个gui滑块创建x对象中的y。我希望每个滑块都使用其value属性来描述当前markerfigure的位置。

每个滑块的范围为-44。我已经尝试通过figure获取当前fig = gcf句柄,因此我可以尝试通过滑块中的callback函数控制其属性。查看fig的属性后,我似乎无法找到名为marker的属性。目前我对于传递给我的函数的内容有点遗失等等。为了测试callback函数是否正常工作,我disp('test')工作正常。

到目前为止,这是我的代码:

figure

% create x slider with handle
x_slider_h = uicontrol('style', 'Slider', 'Min', -4, 'Max', 4, 'Value', 0, 'units', 'normalized', 'position', [0.1 0.2 0.4 0.08], 'callback', @changeX);

% create y slider with handle
y_slider_h = uicontrol('style', 'Slider', 'Min', -4, 'Max', 4, 'Value', 0, 'units', 'normalized', 'position', [0.45 0.3 0.08 0.4], 'callback', @changeY);

% create axes with handle
axes_h = axes('Position', [0.09 0.32 0.4 0.5]);

% set axis equal to the sliders min and max
set(axes_h, 'YLim', [-4 4], 'XLim', [-4 4]);

我也很好奇你如何改变每个滑块的分辨率,因为我试图改变slider手柄中的一些属性,如SliderStep认为它会改变分辨率。

1 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西。 我创建了一个虚拟函数,您可以复制/粘贴并尝试在您身边。我为两个滑块创建了一个侦听器对象,其回调在擦除前一个绘制的标记后更新标记的位置。这应该适用于您的特定应用程序:

function UpdateMarker(~)
clc
clear

hFig = figure('Position',[100 100 400 400],'Units','normalized');

%// create axes with handle
handles.axes1 = axes('Position', [0.2 0.2 0.6 0.6],'XLimMode','manual','YLimMode','manual','XLim',[-4 4],'YLim',[-4 4]);

%// create x slider with handle
handles.x_slider = uicontrol('style', 'Slider','Min',-4,'Max',4,'Value', 0,'units','normalized','position', [0.2 0.08 0.6 0.08], 'callback', @(s,e) UpdateX);
handles.SliderxListener = addlistener(handles.x_slider,'Value','PostSet',@(s,e) XListenerCallBack);


% create x slider with handle
handles.y_slider = uicontrol('style', 'Slider', 'Min', -4, 'Max', 4, 'Value', 0, 'units', 'normalized', 'position', [0.08 0.2 0.08 0.6], 'callback', @(s,e) UpdateY);
handles.SlideryListener = addlistener(handles.y_slider,'Value','PostSet',@(s,e) YListenerCallBack);

%// Some data to plot
handles.xdata = -4:4;
handles.ydata = sin(handles.xdata).*rand(1,numel(handles.xdata));

plot(handles.xdata,handles.ydata,'parent',handles.axes1)

%// set axis equal to the sliders min and max
set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4],'XTick',-4:1:4,'YTick',-4:1:4);

guidata(hFig,handles);


    function XListenerCallBack

        handles = guidata(hFig); %// Get handles.

        axes(handles.axes1);
        set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4]); %// Set axis limits

        hold on %// Important, otherwise it erases the current data plotted.

        %// Get position of both sliders
        xval = (get(handles.x_slider,'value'));
        yval = (get(handles.y_slider,'value'));

        %// Delete current marker
        delete(findobj(gca, 'type', 'patch'));

        %// Plot new marker.You can customize its properties as you want.
        scatter(handles.axes1,xval,yval,40,'r')

    end

    function YListenerCallBack

        handles = guidata(hFig);

        axes(handles.axes1);
        set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4]);

        hold on

        xval = (get(handles.x_slider,'value'));
        yval = (get(handles.y_slider,'value'));

        delete(findobj(gca, 'type', 'patch'));
        scatter(handles.axes1,xval,yval,40,'r')

    end

    function UpdateY(~)

    end

    function UpdateX(~)

    end
end

以下是该图的截图:

enter image description here

希望有所帮助!如果有什么不清楚请问!