2010-11-17 57 views
1

为清晰起见进行了编辑:MATLAB可以生成,保存并动态加载轴到GUI轴对象吗?

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

我试图生成数字,然后保存它们,并试图加载到GUI对象的轴,它没有工作。

如果我最初用做轴的GUI对象为目标轴我无法保存的情节和传说等情节..

在MATLAB这可能吗?

+0

我不确定我是否按照你的问题,但也许这是相关的:http://stackoverflow.com/questions/4008880/producing-subplots-to-then-combine-them-into-a-figure-later -matlab – Amro 2010-11-17 00:31:22

+0

你的问题不清楚; “如果我将轴对象设置为当前轴,我无法保存绘图/数据”是什么意思?无论如何,你是否考虑保存数据本身(例如x,y对)而不是轴对象?您是否看过Matlab文档中的示例:http://www.mathworks.com/help/techdoc/creating_guis/bqz79mu.html – 2010-11-17 08:52:02

回答

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 
1

如果我理解正确的问题,你必须用斧头GUI和回调绘制的东西到轴。出于某种原因,例如因为绘图需要一段时间,所以您希望能够保存特定的绘图并且能够重新加载它。

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

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

如果由于某些原因不足以保存属性,则可以生成一个隐藏图形,并使用COPYOBJ将坐标轴及其子图复制到该图中,然后保存该图。然而,这很笨拙,可能会带来各种令人惊讶的烦恼。

+0

是的,您对问题有正确的理解。我有代码生成~40个地块,每个都需要一段时间才能完成。我希望我可以使用两个窗口的GUI,但我坚持一个窗口。我会尝试你的第二个建议以及下面的gnovice。 – 2010-11-18 14:43:41

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 

现在,你可以使面板可见和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保存到您的绘制线条和文本中,则可以在使它们再次可见之前使用新值更新它们。

+0

谢谢,我之前没有使用过UIPANELS。我会尝试在我的GUI中添加面板。 – 2010-11-18 14:51:59

+0

@R Biser:如果您确实尝试使用UIPANELs,您可能需要修改代码以切换其可见性,因为您将拥有〜40个面板。我建议先把所有的UIPANEL句柄放在一个向量中,比如'hPanels = [h1 h2 ... h39 h40];'。然后,一个简单的方法,你可以使面板'我'可见将被设置(hPanels,'可见','关');集(hPanels(i)中, '可见', '上');的DrawNow;'。 – gnovice 2010-11-18 15:09:50