MatLab - 使用 GUI 滑块控制绘图中的标记
MatLab - Controlling Markers in a Plot Using GUI Sliders
我正在尝试 plot/control marker
在我创建的 axes
对象中,该对象使用 2 个代表 x
和 y
的 gui 滑块坐标。我希望每个滑块都使用其 value
属性来描述当前 figure
中的 marker
的位置。
每个滑块的范围为 -4
到 4
。我已经尝试通过 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
这是该图的截图:
希望对您有所帮助!如有不明之处请追问!
我正在尝试 plot/control marker
在我创建的 axes
对象中,该对象使用 2 个代表 x
和 y
的 gui 滑块坐标。我希望每个滑块都使用其 value
属性来描述当前 figure
中的 marker
的位置。
每个滑块的范围为 -4
到 4
。我已经尝试通过 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
这是该图的截图:
希望对您有所帮助!如有不明之处请追问!