MATLAB可以动态生成,保存轴,然后将轴加载到gui轴对象中吗?

时间:2010-11-17 00:27:12

标签: user-interface matlab plot

为清晰起见编辑:

我有一个GUI来控制一个生成大约40个图的脚本。我想通过在下拉框中选择其编号,在GUI窗口中按需显示任何给定的图。问题是图表需要一段时间才能生成,所以我宁愿将它们制作一次,然后根据需要将它们加载到GUI中的axes对象中。每个地块都有不同的属性,标签,图例等。

我尝试生成数字,然后保存它们并尝试将其加载到GUI中的axes对象中,但它不起作用。

如果我最初使用GUI中的axis对象作为目标轴来绘制图表,则无法保存图表和图例等。

这在MATLAB中是否可行?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你就会有一个带有轴的GUI和一个回调来将东西绘制到轴上。出于某种原因,例如因为绘图需要一段时间,您希望能够保存特定的绘图并能够重新加载它。

处理这个问题最简单的方法是不要将一个轴对象放入你的GUI,而是使用双窗口GUI,其中一个窗口包含所有控件,另一个是你绘制内容的图形。这有利于以下几个原因:保存/加载变得容易,您可以访问图形工具栏,并且您可以根据需要调整图形大小(调整GUI通常是毛茸茸的)。您可以通过SETAPPDATA将句柄存储在GUI句柄结构中的图形轴上,并通过GETAPPDATA访问它。请注意,您需要在绘图回调的开头进行一个小检查,在此处使用轴句柄上的ISHANDLE检查图形是否仍然存在,如果检查返回{{1,则打开一个新图形}}

如果你真的想在你的GUI中有一个轴对象,最简单的方法就是保存x和y数据,以及用户可以自定义的绘图的其他属性(图例是否在,或关闭,或图例的false属性),以便您可以动态重新生成它。

如果由于某种原因仅保存属性是不够的,您可以生成隐藏的图形,并使用COPYOBJ将轴及其子项复制到该图形,然后保存。然而,这是相当笨拙的,可能带来各种令人惊讶的烦恼。

答案 1 :(得分:0)

您需要知道图中轴的手柄。否则,如果图形包含较新的轴对象,则很难更改轴属性,因为gca将引用新轴。

通过图形对象生成图形后可以访问轴,因为图形的各个轴是图形对象的子图形。以下代码段可能对您有所帮助。

close all

subplot(2,1,1)
subplot(2,1,2)

hAxes = get(gcf, 'Children')

get(hAxes(1)) %shows axes properties of one axes obj
get(hAxes(2)) %shows axes properties of the other

set(hAxes(1), 'YTickLabel', ['a';'b';'c';'d';'e';'f']) %set an axis property

答案 2 :(得分:0)

我在这里猜测一下,但听起来你想创建一个GUI,其轴显示不同的图,图例等,根据选择的下拉菜单项。如果这是正确的,我猜你遇到的问题是在轴上绘制一组新数据会导致旧数据被替换,这样每次选择新菜单时都必须重新生成整个绘图项目

我会考虑解决此问题的一种方法是使用UIPANELs'Visible' property图形对象。您可以为每个菜单项创建一个面板,为每个菜单项添加一个轴以及您要绘制的任何数据,然后使用SET命令切换面板的可见性,而不是在选择新菜单项时重新绘制所有内容。这是一个例子:

hFigure = figure;                     %# Create a figure

hPanelA = uipanel('Parent',hFigure);  %# Add panel A to the figure
hAxesA = axes('Parent',hPanelA);      %# Add an axes to panel A
plot(hAxesA,1:10,rand(1,10),'r');     %# Plot a red line
text(5,0.5,'hello','Parent',hAxesA);  %# Plot some text
legend(hAxesA,'red line');            %# Add a legend

hPanelB = uipanel('Parent',hFigure);  %# Add panel B to the figure
hAxesB = axes('Parent',hPanelB);      %# Add an axes to panel B
plot(hAxesB,1:10,rand(1,10),'b');     %# Plot a blue line
text(5,0.5,'world','Parent',hAxesB);  %# Plot some text
legend(hAxesB,'blue line');           %# Add a legend

现在,您可以通过执行以下操作使面板A可见,面板B不可见:

set([hPanelA hPanelB],{'Visible'},{'on'; 'off'});

您可以执行相反的操作(隐藏面板A并显示面板B):

set([hPanelA hPanelB],{'Visible'},{'off'; 'on'});

您应该注意到,两个面板之间用两个独立的轴切换是快速而平滑的,如果您每次想要查看时必须在一组轴上擦除和重新绘制数据,情况可能就不是这样了在一个新的情节。在创建GUI时创建所需的所有图形对象,然后使用SET命令根据需要修改可见性(或其他属性),从而实现更高效的GUI。

另请注意,即使对象属性不可见,您仍然可以修改对象属性,因此(从上面的示例继续)我可以执行以下操作:

set([hPanelA hPanelB],{'Visible'},{'on'; 'off'});  %# Hide panel B
set(hPanelB,'BackgroundColor','b');                %# Change the color of panel B
set([hPanelA hPanelB],{'Visible'},{'off'; 'on'});  %# Show panel B

现在您应该看到面板B的背景颜色为蓝色。如果您还将handles保存到绘制的线条和文字中,则可以使用新值更新它们,然后再将它们显示。