使用编程 GUI 在选项卡组内选择轴
Selecting Axis inside a tab group with a programmatic GUI
在 MATLAB 中使用 OOP 创建 GUI 时,我无法理解如何控制要在哪个轴或哪个选项卡中绘制数据。我附上示例代码以帮助解决我的问题
首先,加载GUI时,只有Tab 2下的Axis 2标题为(Axis 2),代码title('Axis 1');
好像没打通。这是为什么?
代码为运行时,Tab1或Tab2默认没有绘图。如果在Tab1打开的情况下点击"Plot Data",然后切换到Tab2,可以看到Tab2中绘制了正弦曲线。但根据我的代码,或者至少我正在尝试做的是,正弦曲线应该出现在 Tab1 的 Axis1 中。
但是当你点击Tab2,然后点击'Plot Data',曲线变为指数,这是我所期望的。
我对使用 MATLA 的 OOP GUI 还是很陌生,所以我可能遗漏了一些简单的东西。感谢您的帮助和评论。
classdef example < handle
properties
Figure;
TabGroupAxis;
TabsAxis;
Axis1;
Axis2;
ButtonPlotData;
DataToPlot;
end
methods
function obj = example()
create(obj)
makeUpData(obj);
end
function create(obj)
obj.Figure = figure('Position',[300 300 640 640]);
obj.TabGroupAxis = uitabgroup(obj.Figure,'Units','pixels','Position',[100 20 600 600]);
obj.TabsAxis(1) = uitab(obj.TabGroupAxis,'Title','Tab1');
obj.TabsAxis(2) = uitab(obj.TabGroupAxis,'Title','Tab2');
obj.Axis1 = axes('Parent',obj.TabsAxis(1),'Units','pixels','Position',[30 20 500 500]);
obj.Axis2 = axes('Parent',obj.TabsAxis(2),'Units','pixels','Position',[30 20 500 500]);
obj.ButtonPlotData = uicontrol(obj.Figure,'Style','pushbutton','String','Plot Data',...
'Callback',@obj.buttonPlotDataCallback);
axis(obj.Axis1);
title('Axis 1');
axis(obj.Axis2);
title('Axis 2');
end
function makeUpData(obj)
obj.DataToPlot(1).x = linspace(0,2*pi);
obj.DataToPlot(1).y = sin(obj.DataToPlot(1).x);
obj.DataToPlot(2).x = linspace(0,2*pi);
obj.DataToPlot(2).y = exp(obj.DataToPlot(1).x);
end
function buttonPlotDataCallback(obj,hObject,eventdata)
activeTab = obj.TabGroupAxis.SelectedTab.Title;
switch activeTab
case 'Tab1'
axis(obj.Axis1);
plot(obj.DataToPlot(1).x,obj.DataToPlot(1).y);
case 'Tab2'
axis(obj.Axis2);
plot(obj.DataToPlot(2).x,obj.DataToPlot(2).y);
end
end
end
end
长答案
问得好,你的例子让我很容易理解这个问题。我在 buttonPlotDataCallback 中放置了一个断点,看到 switch case 运行正常,问题是 axis(obj.Axis1)
没有改变焦点。查看文档,那是因为那不是 axis
的正确用法。
另一种绘制函数的方法是使用 plot
的重载方法
case 'Tab1'
plot(obj.Axis1,obj.DataToPlot(1).x,obj.DataToPlot(1).y);
现在我们意识到 axis1 没有标题的原因是第 34 行对 axis 的调用也不起作用。这也可以通过重载来解决,这次 title
.
title(obj.Axis1,'Axis 1');
更简短的回答
事实证明 axes
完全符合您使用 axis
的目的。您有一个打字错误,但没有被发现,因为 axis
是一个有效的函数。将 axis(< handle >)
更改为 axes(< handle >)
就可以了。
在 MATLAB 中使用 OOP 创建 GUI 时,我无法理解如何控制要在哪个轴或哪个选项卡中绘制数据。我附上示例代码以帮助解决我的问题
首先,加载GUI时,只有Tab 2下的Axis 2标题为(Axis 2),代码
title('Axis 1');
好像没打通。这是为什么?代码为运行时,Tab1或Tab2默认没有绘图。如果在Tab1打开的情况下点击"Plot Data",然后切换到Tab2,可以看到Tab2中绘制了正弦曲线。但根据我的代码,或者至少我正在尝试做的是,正弦曲线应该出现在 Tab1 的 Axis1 中。
但是当你点击Tab2,然后点击'Plot Data',曲线变为指数,这是我所期望的。
我对使用 MATLA 的 OOP GUI 还是很陌生,所以我可能遗漏了一些简单的东西。感谢您的帮助和评论。
classdef example < handle
properties
Figure;
TabGroupAxis;
TabsAxis;
Axis1;
Axis2;
ButtonPlotData;
DataToPlot;
end
methods
function obj = example()
create(obj)
makeUpData(obj);
end
function create(obj)
obj.Figure = figure('Position',[300 300 640 640]);
obj.TabGroupAxis = uitabgroup(obj.Figure,'Units','pixels','Position',[100 20 600 600]);
obj.TabsAxis(1) = uitab(obj.TabGroupAxis,'Title','Tab1');
obj.TabsAxis(2) = uitab(obj.TabGroupAxis,'Title','Tab2');
obj.Axis1 = axes('Parent',obj.TabsAxis(1),'Units','pixels','Position',[30 20 500 500]);
obj.Axis2 = axes('Parent',obj.TabsAxis(2),'Units','pixels','Position',[30 20 500 500]);
obj.ButtonPlotData = uicontrol(obj.Figure,'Style','pushbutton','String','Plot Data',...
'Callback',@obj.buttonPlotDataCallback);
axis(obj.Axis1);
title('Axis 1');
axis(obj.Axis2);
title('Axis 2');
end
function makeUpData(obj)
obj.DataToPlot(1).x = linspace(0,2*pi);
obj.DataToPlot(1).y = sin(obj.DataToPlot(1).x);
obj.DataToPlot(2).x = linspace(0,2*pi);
obj.DataToPlot(2).y = exp(obj.DataToPlot(1).x);
end
function buttonPlotDataCallback(obj,hObject,eventdata)
activeTab = obj.TabGroupAxis.SelectedTab.Title;
switch activeTab
case 'Tab1'
axis(obj.Axis1);
plot(obj.DataToPlot(1).x,obj.DataToPlot(1).y);
case 'Tab2'
axis(obj.Axis2);
plot(obj.DataToPlot(2).x,obj.DataToPlot(2).y);
end
end
end
end
长答案
问得好,你的例子让我很容易理解这个问题。我在 buttonPlotDataCallback 中放置了一个断点,看到 switch case 运行正常,问题是 axis(obj.Axis1)
没有改变焦点。查看文档,那是因为那不是 axis
的正确用法。
另一种绘制函数的方法是使用 plot
的重载方法case 'Tab1'
plot(obj.Axis1,obj.DataToPlot(1).x,obj.DataToPlot(1).y);
现在我们意识到 axis1 没有标题的原因是第 34 行对 axis 的调用也不起作用。这也可以通过重载来解决,这次 title
.
title(obj.Axis1,'Axis 1');
更简短的回答
事实证明 axes
完全符合您使用 axis
的目的。您有一个打字错误,但没有被发现,因为 axis
是一个有效的函数。将 axis(< handle >)
更改为 axes(< handle >)
就可以了。