为清晰起见编辑:
我有一个GUI来控制一个生成大约40个图的脚本。我想通过在下拉框中选择其编号,在GUI窗口中按需显示任何给定的图。问题是图表需要一段时间才能生成,所以我宁愿将它们制作一次,然后根据需要将它们加载到GUI中的axes对象中。每个地块都有不同的属性,标签,图例等。
我尝试生成数字,然后保存它们并尝试将其加载到GUI中的axes对象中,但它不起作用。
如果我最初使用GUI中的axis对象作为目标轴来绘制图表,则无法保存图表和图例等。
这在MATLAB中是否可行?
答案 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保存到绘制的线条和文字中,则可以使用新值更新它们,然后再将它们显示。