我有一个(编程式)GUI,其中包含一些axes
父级结构中的uipanel
个对象。其中一些axes
有legend
个对象关联,有些则不关联
我想在我的GUI中包含一个按钮,它将当前可见的绘图复制到一个新的图形中,包括legend
(如果有的话)。
我知道如何获取其中当前可见的uipanel
和所有axes
对象的句柄。我也知道如何告诉axes
除了legend
s。
我如何匹配 legend
到axes
?
例如,在一个案例中,我的GUI显示2 axes
有一些图,每个图都有自己的legend
。当我点击“导出”按钮时,我想要创建2个新图,每个图包含一个axes
及其对应的legend
。
我目前能做的是
uipanel
中的位置相同),问题是,我没有这些对象的句柄。我只有uipanel
对象的句柄。面板内的图形由另一个函数构建,该函数包含各种棘手的东西,但不返回句柄。所述面板的父母结构使得get(handles.panels{1},'Children')
这样的技巧很难做到这一点,因为它可以在一些但不是所有情况下都有效。
我想过简单地导出面板(并且实际上有一个工作版本可以做到这一点),但这有几个问题,主要与图形工具和调整大小有关。我想在使用“导出”按钮时摆脱面板。
以下代码段将创建一个示例GUI,可以访问我在完整GUI中访问的所有句柄。单击按钮将显示我“工作”的不同版本。我想要的是每个轴的一个数字,包括它的传奇,如果有的话。第4个版本(同一个父级)接近,但如果遇到subplot
则中断,第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
答案 0 :(得分:2)
在图中,图形对象按层次结构组织,可以单独处理。例如,axis是图形的子图形,plot是轴的子图形,而图形是轴的构造。
以下示例绘制了2行(红色和蓝色,带有图例),然后使用copyobj
混合绘图和图例。
figure;
subplot(1,2,1)
hp1 = plot(1:10,'r')
hl1 = legend('red')
subplot(1,2,2)
hp2 = plot(1:10,'b')
hl2 = legend('blue')
hf = figure;
hax = axes;
copyobj(hp1, hax); %copy plot to axes
copyobj(hl2, hf); %copy legend to figure
虽然没有使用GUI进行测试。
答案 1 :(得分:1)
我认为更简单的解决方案是保存你想要保存为无花果档案的人物轴。
h = figure(1);
x = linspace(1,100);
y = 2*x;
ax = findall(h,'type','axes');
plot(x,y);
save('youraxes', 'ax');
hgsave(h, 'yourfig.fig');
我使用Matlab R2012a,或者在R2013a或b中保存图的功能现在为savefig
。
答案 2 :(得分:0)
获得轴手柄后,您可以使用
找到相应的图例手柄 legend_handle = legend(axes_handle)