使用编程 GUI 在选项卡组内选择轴

Selecting Axis inside a tab group with a programmatic GUI

在 MATLAB 中使用 OOP 创建 GUI 时,我无法理解如何控制要在哪个轴或哪个选项卡中绘制数据。我附上示例代码以帮助解决我的问题

  1. 首先,加载GUI时,只有Tab 2下的Axis 2标题为(Axis 2),代码title('Axis 1');好像没打通。这是为什么?

  2. 代码为运行时,Tab1或Tab2默认没有绘图。如果在Tab1打开的情况下点击"Plot Data",然后切换到Tab2,可以看到Tab2中绘制了正弦曲线。但根据我的代码,或者至少我正在尝试做的是,正弦曲线应该出现在 Tab1 的 Axis1 中。

  3. 但是当你点击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 >) 就可以了。