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

MatLab - Controlling Markers in a Plot Using GUI Sliders

我正在尝试 plot/control marker 在我创建的 axes 对象中,该对象使用 2 个代表 xy 的 gui 滑块坐标。我希望每个滑块都使用其 value 属性来描述当前 figure 中的 marker 的位置。

每个滑块的范围为 -44。我已经尝试通过 fig = gcf 获取当前 figure 句柄,因此我可以尝试通过滑块的 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 认为它会更改分辨率。

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

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

这是该图的截图:

希望对您有所帮助!如有不明之处请追问!