Matlab 将图例与轴对象匹配 背景:
我有一个(编程的)GUI,它在一些Matlab 将图例与轴对象匹配 背景:,matlab,legend,axes,Matlab,Legend,Axes,我有一个(编程的)GUI,它在一些uipanelparenting结构中包含几个axes对象。其中一些轴具有关联的图例对象,而一些没有关联。 我想在我的GUI中包括一个按钮,该按钮将当前可见的绘图复制到一个新图形中,包括其图例(如果有) 我知道如何获取当前可见的ui面板和其中所有轴对象的句柄。我还知道如何区分轴和图例s 问题: 如何将图例与轴匹配 例如,在一种情况下,我的GUI显示了2个轴,带有一些图,每个图都有自己的图例。当我单击“导出”按钮时,我希望创建两个新图形,每个图形包含一个轴,以及相
uipanel
parenting结构中包含几个axes
对象。其中一些轴
具有关联的图例
对象,而一些没有关联。我想在我的GUI中包括一个按钮,该按钮将当前可见的绘图复制到一个新图形中,包括其
图例(如果有)
我知道如何获取当前可见的ui面板
和其中所有轴
对象的句柄。我还知道如何区分轴
和图例
s
问题:
如何将图例
与轴
匹配
例如,在一种情况下,我的GUI显示了2个轴,带有一些图,每个图都有自己的图例。当我单击“导出”按钮时,我希望创建两个新图形,每个图形包含一个轴
,以及相应的图例
我现在能做的是
将所有内容放在一个图中(在这种情况下,它们重叠,因为它们在原始ui面板中的位置相同)
将每个轴和每个图例放入各自的图形中
将所有轴放在一个图形中,将所有图例放在另一个图形中,然后
将所有轴放在它们自己的图形中,并将所有图例放在同一面板中
按面板分割,即将所有子地块放在同一个图形中,每组地块放在各自的图形中
问题:
问题是,我没有这两个对象的句柄。我只有ui面板
对象的句柄。面板内的图形是由另一个函数构建的,该函数包含各种棘手的内容,但不返回句柄。此外,上述面板的家长结构使得使用get(handles.panels{1},'Children')
等技巧很难做到这一点,因为它在某些情况下有效,但并非在所有情况下都有效。
我曾考虑过简单地导出面板(实际上有一个可以这样做的工作版本),但这有几个问题,主要与图形工具和调整大小有关。我想在使用“导出”按钮时去掉面板
代码片段/示例:
下面的代码片段将创建一个示例GUI,可以访问我在完整GUI中可以访问的所有句柄。点击按钮将显示我开始“工作”的不同版本。我想要的是每个轴都有一个图形,包括它的图例(如果有)。第四个版本(同一个父版本)很接近,但如果遇到子批次
s,则会中断,第五个版本(通过面板)只是将整个子批次组放在一个窗口中(在这种情况下,至少它们不会重叠)。将代码复制到一个新的.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
在图形中,图形对象是按层次组织的,可以单独处理。例如,轴是图形的子对象,绘图是轴的子对象,图例构建为轴
下面的示例绘制两行(红色和蓝色,带有图例),然后使用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进行测试。我认为更简单的解决方案是将要保存的图形的轴保存为fig文件
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
,一旦获得轴手柄,您可以使用
legend\u handle=legend(axes\u handle)
问题是,我无法访问您示例中的hl1
和hl2
。因此,我稍后将尝试检索它们。设想您的第一个图形(带有子图)被保存为.fig
,并在另一个函数/脚本/会话中重新打开。那你就没有把手了。在这种情况下,您将如何实现相同的目标(或实际复制匹配的目标,但旋转方向相同)?保存图形将保存所有子轴,包括图例。我不明白为什么在你的场景中情节/传说是分离的。此外,只要调用legend
,您就可以根据图形重新创建图例。最后,您可以使用set(gcf,'UserData',legend_handle)
将图例数据嵌入图形中,以便稍后检索。它们没有分离,我想分离它们。我想打开包含子地块图形的.fig
,然后创建一个仅包含红色轴(包括其图例)的新图形。我无法将图例句柄保存在UserData
中,因为我从一开始就没有得到它。图形是由一个我无法更改的外部函数创建并加载到uipanel
对象中的。该函数不会返回图例句柄。这对解决问题有何帮助?如果你指的是我对麦克达夫回答的评论,那只是一个简单的例子来说明我想做什么。这与我的实际问题无关。