【问题标题】:MATLAB simple slider on a figure图上的 MATLAB 简单滑块
【发布时间】:2013-04-12 15:52:08
【问题描述】:

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

【问题讨论】:

  • 不幸的是,这不会是一件微不足道的事情。您需要添加一个滑块并编写一个回调。你想到 Mathematica 了吗?
  • 是的,也许是这样的。我是通过使用 GLIDE 创建一个界面来完成的。但似乎有命令(uicontrol)可以在图形上放置控件。我想知道与现有的 Matlab 脚本无缝集成的最小代码是什么。我不介意编写回调,但我不想在这些对象中携带从回调传递到回调的所有数据。回调是否可以从工作区读取数据?
  • 您可以一次绘制所有条并将它们设置为不可见(第一个除外),然后滑块将简单地将可见设置为感兴趣的。

标签: matlab matlab-figure


【解决方案1】:

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

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

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

您将需要查看诸如Position 之类的属性来设置图上的位置,并查看MaxMin 来设置可能的值范围。另请注意,如果您在函数内执行此操作,您的 sliderCallback 可以是嵌套函数,这可能会使重绘显示变得更容易。如果您在脚本中运行它,sliderCallback 必须位于单独的文件中。

【讨论】:

  • 谢谢。我最终使用了一个嵌套函数(在函数内)进行回调,从那时起我可以直接使用函数工作区中的变量。
【解决方案2】:

下面是滑块绘制对应列的代码:

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]) 手动设置它们即可。

【讨论】:

  • 这个例子有点误导。它每次都重新绘制,这从许多角度来看都不是最佳的,但立即发生的一件事是不断变化的xlims。看起来滑块改变的是 y 轴而不是直线。
  • 你是对的。性能方面,重置线对象的YData 更快。尽管新数据可能超出当前限制。
  • 这就是为什么我建议绘制所有内容、自定义轴、隐藏一些数据并链接滑块以隐藏/显示相关的“列”。
  • 我同意,回调函数可以实现不同的,具体取决于任务。
  • 好的。我还弄清楚了拖后更改的问题。一个使用 addlistener(hsl,'Value','PostSet', @sliderDragged);在 sliderDragged 中,可以通过 eventdata.newValue 访问滑块的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多