tho*_*mas 2 matlab user-interface slider matlab-figure matlab-gui
我尝试以编程方式创建一个MATLAB GUI,并面对我的滑块在使用后消失的问题.我隔离了问题以保持代码简短.在这个GUI中,我想在plotmatrix每次使用滑块时刷新(忽略滑块的值与我的程序完全无关的事实,如前所述,我真的想保持代码清洁,这就是为什么我也删除了这个功能) .这是代码(您必须将其作为函数运行):
function StackOverflowQuestion_GUI()
% clear memory
close all; clc;
% initialize figure
f = figure;
% create main axes
AX_main = axes('Parent',f,...
'Units','normalized','Position',[.1 .2 .8 .7]);
% create slider
uicontrol('Parent',f,...
'Style','slider','Callback',{@sliderCallback,AX_main},...
'Units','normalized','Position',[0.05 0.05 0.9 0.05]);
plotmatrix(AX_main,randn(500,3));
title('Random Plotmatrix');
end
function sliderCallback(~,~,AX_main) % callback for slider
plotmatrix(AX_main,randn(500,3));
title('Random Plotmatrix NEW');
end
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!我想我误解了AXES的概念.当我绘制到我创建的AXES手柄时,为什么该图的其他部分也会受到影响?如果有人能向我解释这个图形处理系统基本上是如何工作的,那也是非常好的!
虽然达人山的答案是正确的,但这种奇怪的行为让我很好奇,看看背后是什么.
单步执行plotmatrix我们可以找到删除滑块对象的行:
% Create/find BigAx and make it invisible
BigAx = newplot(cax);
Run Code Online (Sandbox Code Playgroud)
这里什么都不明显,做newplot什么?
newplot在高级图形代码的开头使用,以确定要为图形输出定位的图形和轴.调用newplot可以更改当前图形和当前轴.基本上,当您在现有图形和轴中绘制图形时,有三个选项:
添加新图形而不更改任何属性或删除任何对象.
在绘制新对象之前,删除其句柄未隐藏的所有现有对象.
删除所有现有对象,无论其句柄是否被隐藏,并在绘制新对象之前将大多数属性重置为其默认值(有关具体信息,请参阅下表).
哦...
所以newplot被删除滑块对象.
那么为什么要hold阻止滑块被删除,尽管它是一个轴方法而不是一个数字方法?首先,请查看文档中的"算法"主题:
该
hold函数将或 对象的NextPlot属性设置为或.AxesPolarAxes'add''replace'
因此,hold on将此设置'add'为当前轴.然而,由于我目前无法弄清楚的原因,这也设置了NextPlot该数字add.
我们可以通过一个简短的片段看到这个:
f = figure('NextPlot', 'replacechildren');
ax = axes;
fprintf('NextPlot Status, base:\nFig: %s, Ax(1): %s\n\n', f.NextPlot, ax.NextPlot)
hold on
fprintf('NextPlot Status, hold on:\nFig: %s, Ax(1): %s\n\n', f.NextPlot, ax.NextPlot)
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
NextPlot Status, base:
Fig: replacechildren, Ax(1): replace
NextPlot Status, hold on:
Fig: add, Ax(1): add
Run Code Online (Sandbox Code Playgroud)
奇怪的行为,但我不会纠缠于此.
为什么这很重要?回到newplot文档.首先,newplot读取数字的NextPlot属性以确定要执行的操作.默认情况下,图形的NextPlot属性设置为'add',因此它将保留所有当前图形对象,但plotmatrix显式更改:
if ~hold_state
set(fig,'NextPlot','replacechildren')
end
Run Code Online (Sandbox Code Playgroud)
所以newplot来自:
绘制到当前图形而不清除任何已存在的图形对象.
至:
删除其
HandleVisibility属性设置为的所有子对象,on并将figureNextPlot属性重置为add.这将清除当前数字,相当于发出
clf命令.
这解释了滑块消失的原因以及hold on解决问题的原因.
根据newplot我们的文档,我们还可以设置HandleVisibility滑块UIcontrol以防止它被销毁:
% create slider
uicontrol('Parent',f,...
'Style','slider','Callback',{@sliderCallback,AX_main},...
'Units','normalized','Position',[0.05 0.05 0.9 0.05], ...
'HandleVisibility', 'off');
Run Code Online (Sandbox Code Playgroud)