【发布时间】:2014-02-14 12:27:40
【问题描述】:
上下文:
我有一个(程序化的)GUI,它在一些uipanel 育儿结构中包含几个axes 对象。其中一些 axes 关联了 legend 对象,有些则没有。
我想在我的 GUI 中包含一个按钮,它将当前可见的绘图复制到一个新图形中,包括它的 legend(如果有的话)。
我知道如何获取当前可见的uipanel 和其中所有axes 对象的句柄。我也知道如何区分axes 和legends。
问题:
我如何匹配 legends 到 axes?
例如,在一种情况下,我的 GUI 显示 2 axes 和一些绘图,每个绘图都有自己的 legend。当我单击“导出”按钮时,我想要创建 2 个新图形,每个包含一个 axes 及其对应的 legend。
我目前能做的是
- 把所有东西都放在一个图中(在这种情况下它们会重叠,因为它们在原始
uipanels 中的位置是相同的), - 将每个轴和每个图例放入各自的图形中,
- 将所有轴放在一个中,将所有图例放在另一个图中,然后
- 将所有坐标轴放在自己的图中,将所有图例放在同一个面板中。
- 按面板拆分,即将所有子图放到同一个图中,每组图放到自己的图中。
问题:
问题是,我没有这些对象的句柄。我只有uipanel 对象的句柄。面板内的图形是由另一个函数构建的,该函数包含各种棘手的东西,但不返回句柄。此外,所述面板的育儿结构使得使用 get(handles.panels{1},'Children') 之类的技巧很难做到这一点,因为它适用于某些情况,但并非所有情况。
我想过简单地导出面板(实际上有一个可以执行此操作的工作版本),但这有几个问题,主要与图形工具和调整大小有关。当我使用“导出”按钮时,我想摆脱面板。
代码片段/示例:
以下代码 sn-p 将创建一个示例 GUI,它可以访问我在完整 GUI 中可以访问的所有句柄。单击按钮将显示我要“工作”的不同版本。我想要的是每个轴的一个图包括它的图例,如果它有的话。第 4 版(相同的父版)接近,但如果遇到subplots 则会中断,第 5 版(按面板)只是将整个子图组放入一个窗口(在这种情况下,至少它们不会重叠)。将代码复制到一个新的.m文件中试试看。
function test
figure(1)
clf
t=(0:0.1:10)'; %'// dummy comment
p2 = uipanel('Visible','off','Position',[0 0 1 1]);
p1 = uipanel('position',[0 0 1 1]);
p11 = uipanel('Parent',p1,'Position',[0 0 0.5 0.9]);
p12 = uipanel('Parent',p1,'Position',[0.5 0 0.5 0.9]);
uicontrol('Style','push','String','all in one','Units','norm',...
'Position',[0.05 0.91 0.14 0.06],'Callback',@export1);
uicontrol('Style','push','String','all in own','Units','norm',...
'Position',[0.24 0.91 0.14 0.06],'Callback',@export2);
uicontrol('Style','push','String','by type','Units','norm',...
'Position',[0.43 0.91 0.14 0.06],'Callback',@export3);
uicontrol('Style','push','String','same parent','Units','norm',...
'Position',[0.62 0.91 0.14 0.06],'Callback',@export4);
uicontrol('Style','push','String','same panel','Units','norm',...
'Position',[0.81 0.91 0.14 0.06],'Callback',@export5);
subplot(1,1,1,'Parent',p11)
plot(t,[sin(t) cos(t)])
legend('Sine','Cosine')
subplot(2,1,1,'Parent',p12)
plot(t,[polyval([0.05 -1 2],t) exp(-t) abs(t-3)])
subplot(2,1,2,'Parent',p12)
plot(t,erf(t))
legend('Error function')
function export1(~,~)
current = findobj('Type','uipanel','Parent',1,'Visible','on');
visible_axes = findobj(current,'Type','axes');
copyobj(visible_axes,figure);
end
function export2(~,~)
current = findobj('Type','uipanel','Parent',1,'Visible','on');
visible_axes = findobj(current,'Type','axes');
for i=1:length(visible_axes)
copyobj(visible_axes(i),figure);
end
end
function export3(~,~)
current = findobj('Type','uipanel','Parent',1,'Visible','on');
visible_axes = findobj(current,'Type','axes','Tag','');
visible_legends = findobj(current,'Tag','legend');
copyobj(visible_axes,figure);
copyobj(visible_legends,figure);
end
function export4(~,~)
current = findobj('Type','uipanel','Parent',1,'Visible','on');
visible_axes = findobj(current,'Type','axes','Tag','');
visible_legends = findobj(current,'Tag','legend');
for i=1:length(visible_axes)
par = get(visible_axes(i),'Parent');
same = findobj(visible_legends,'Parent',par);
h=figure;
copyobj(visible_axes(i),h)
copyobj(same,h)
end
end
function export5(~,~)
current = findobj('Type','uipanel','Parent',1,'Visible','on');
visible_axes = findobj(current,'Type','axes');
parents = cell2mat(get(visible_axes,'Parent'));
uparents = unique(parents);
for i=1:length(uparents)
copyobj(visible_axes(parents==uparents(i)),figure)
end
end
end
【问题讨论】: