一个图形上的MATLAB简单滑块

一个图形上的MATLAB简单滑块,matlab,matlab-figure,Matlab,Matlab Figure,我有一个矩阵,一次画一列。是否可以将滑块添加到MATLAB图形中(无需大量GUI编程),以便通过移动滑块,在当前轴中显示不同的列?创建滑块的代码是合理的: uicontrol('Style', 'slider', 'Callback', @sliderCallback); function sliderCallback(hObject, evt) fprintf('Slider value is: %d\n', get(hObject, 'Value') ); end 您需要查看属性

我有一个矩阵,一次画一列。是否可以将滑块添加到MATLAB图形中(无需大量GUI编程),以便通过移动滑块,在当前轴中显示不同的列?

创建滑块的代码是合理的:

uicontrol('Style', 'slider', 'Callback', @sliderCallback);

function sliderCallback(hObject, evt)
    fprintf('Slider value is: %d\n', get(hObject, 'Value') );
end

您需要查看属性,如
位置
,以设置图形上的位置,以及
最大值
最小值
以设置可能的值范围。另外请注意,如果在函数中执行此操作,则您的
sliderCallback
可以是一个嵌套函数,这可能会使重新绘制显示更加容易。如果在脚本中运行此操作,
sliderCallback
必须位于单独的文件中。

以下是滑块绘制相应列的代码:

m = ones(5,1)*(1:5);
slmin = 1;
slmax = size(m,2);
plot(m(:,1))
hsl = uicontrol('Style','slider','Min',slmin,'Max',slmax,...
                'SliderStep',[1 1]./(slmax-slmin),'Value',1,...
                'Position',[20 20 200 20]);
set(hsl,'Callback',@(hObject,eventdata) plot(m(:,round(get(hObject,'Value')))) )

编辑

为了获得更好的性能,您只需更新
YData
值:

set(hsl,'Callback',@(hObject,eventdata) ...
    set(hline,'YData',m(:,round(get(hObject,'Value')))) )

要修复y轴限制,只需在第一次调用
plot
后使用
ylim([0 6])
手动设置它们。

不幸的是,这不是一个简单的一行程序。您需要添加一个滑块并编写一个回调。你想到Mathematica了吗?是的,也许是那样的。我通过使用GLIDE创建一个界面来实现这一点。但似乎有命令(uicontrol)将控件放置在图形上。我想知道与现有Matlab脚本无缝集成的最小代码段是什么。我不介意编写一个回调,但我不想在从一个回调传递到另一个回调的对象中携带所有数据。回调是否可以从工作区读取数据?您可以一次绘制所有条并将其设置为不可见(第一条除外),然后滑块将简单地将可见条设置为感兴趣的条。此示例有点误导。它每次都会重新绘制,从许多角度来看这不是最优的,但有一件事是立即发生的,那就是不断变化的
xlims
。看起来滑块改变的是yaxis而不是直线。你是对的。从性能角度看,重置line对象的
YData
更快。尽管新数据可能超出当前限制。这就是为什么我建议绘制所有内容、自定义轴、隐藏一些数据并链接滑块以隐藏/显示相关的“列”。我同意,回调函数可以根据任务的不同来实现。确定。我也已经把这一变化看作是一个问题。一种是使用addlistener(hsl、'Value'、'PostSet'、@sliderDragged);在SliderDraged中,可以使用eventdata.newValue.Thank访问滑块的值。我最终使用了一个嵌套函数(在函数中)进行回调,因为这样我就可以直接使用函数工作区中的变量。