我正在尝试使用代表marker
和axes
坐标的2个gui滑块创建x
对象中的y
。我希望每个滑块都使用其value
属性来描述当前marker
中figure
的位置。
每个滑块的范围为-4
到4
。我已经尝试通过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
认为它会改变分辨率。
答案 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
以下是该图的截图:
希望有所帮助!如果有什么不清楚请问!