在MATLAB中添加灵活的图例

时间:2017-03-29 08:25:57

标签: matlab legend-properties

我正在尝试添加一个灵活的图例(减少行的长度并抑制行和文本之间不必要的空间)到我的图中,我使用了另一篇文章中的步骤:advanced plotting (legend manipulation) in Matlab,代码它工作得很好但是当我试图在传奇修改后在全屏显示图形时,我所做的一切都毫无意义。

x = randn(6,20);

figure(2)
hax = gca;

plot(x(1,:),'--k','linewidth',1.5);
hold on;
plot(x(2,:),'b','linewidth',1.5);
% hold on;
plot(x(3,:),'g','linewidth',1.5);
% hold on;
plot(x(4,:),'r','linewidth',1.5);
% hold on;
plot(x(5,:),'c','linewidth',1.5);
% hold on;
plot(x(6,:),':r','linewidth',1.5);


ylabel('states','fontsize',14); xlabel('time(s)','fontsize',10);
%legend('True','SCKS(h1)','SCKS(h2)','SCKS(h3)','SCKS(h4)','DEM',14);
%
% New call "legend"
%
[leg_h,leg_item_h,~,~]=legend('True','SCKS(h1)','SCKS(h2)','SCKS(h3)','SCKS(h4)','DEM',14);
%
% legendshrink(0.8,[]);
%Fig_legend = legend('Taylor','Euler','LLscheme','LLscheme1');
%set(Fig_legend,'FontSize',7)

grid(hax,'on')
% axis(hax,'tight')
set(hax,'box','on','Layer','top');
set(hax,'tickdir','out')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% GENERATION OF THE LEGEND %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define a scale factor fot the lines
line_scale_factor=1.4;
% Define a scale factor fot the lines
text_scale_factor=1.35;
% Get the "Position" of the legend
orig_leg_pos=get(leg_h,'position')
% Get the number on objects in the legend
n_obj=length(leg_item_h);
% Extract the "Line" object
line_obj=leg_item_h(n_obj/3+1:2:n_obj);
% Get the "LineStyle" of each "Line" in the legend
l_style=get(line_obj,'LineStyle')
% Get the "Color" of each "Line" in the legend
l_col=cell2mat(get(line_obj,'color'))
% Get the "XData" and "YData" of the "Lines" in the legend
leg_x_data=cell2mat(get(line_obj,'xdata'))
leg_y_data=cell2mat(get(line_obj,'ydata'))
% Get the handle of the "Text" of the items in the legend
leg_t=leg_item_h(1:n_obj/3)
% Get the "Text" of the items in the legend
str=get(leg_t,'string')
% Get the "Position" of each "Text" item in the legend
tx=cell2mat(get(leg_t,'position'))
% Delete the original legend
delete(leg_h)
% Create an axes with the same position and size of the original legend
ax=axes('position',orig_leg_pos,'xlim',[0 1],'ylim',[0 1], ...
   'xtick',[],'ytick',[],'box','on')
hold on
% Add the legend items to the axes
for i=1:n_obj/3
   % Add the lines with the original settings (color, style, ...)
   plot([leg_x_data(i,1) leg_x_data(i,2)/line_scale_factor],leg_y_data(i,:),'color',l_col(i,:), ...
                          'linestyle',l_style{i}, ...
                          'linewidth',1.4)
   % Add the text
   th(i,:)=text(leg_x_data(i,2)/text_scale_factor,tx(i,2),0,str{i},'fontsize',9, ...
           'unit','normalized')
end
% Get the maximun extent of the lagend "Text"
tx_max_ext=max(reshape([th(:).Extent],4,6)');
% Evaluate the axis scaling factor
tx_r_1=tx_max_ext(3)+leg_x_data(i,2)/line_scale_factor
% Get the axes position
axp=ax.Position
% Resize the axes width
ax.Position=[axp(1) axp(2) axp(3)*tx_r_1 axp(4)]

1 个答案:

答案 0 :(得分:0)

您可以通过移动以上代码中创建"新图例"的部分来实现您的目标。进入ResizeFcn的{​​{1}}。

每当图形的大小发生变化时,这样就可以使轴基于图例的尺寸变得足够。

为此,您必须以这种方式修改代码:

1)为图中分配figure,这将在tag中用于访问图:

ResizeFcn

2)使用guidata将原始cf=figure('tag','res_leg') 句柄存储到legend对象

figure

3)将% Set in the FIGURE GUIDATA the legend handles my_guidata=guidata(cf) my_guidata.leg_h=leg_h; my_guidata.leg_item_h=leg_item_h % Store the GUIDATA data guidata(cf,my_guidata) 分配给ResizeFcn

figure

4)定义set(cf,'ResizeFcn',['doResizeFcn(''' get(gcf,'tag') ''')'])

只需将{em>%GENERATION OF THE LEGEND%部分中的代码移至名为ResizeFcn的{​​{1}}部分(在本例中为{{} 1}})

对上述代码进行以下更新(按照代码中的顺序):

4.1)获取function

的句柄

4.2)使用ResizeFcn

检索doResizeFcn数据

4.3)检查图中是否已包含用于代替图例的figure;如果是这样,删除它

4.4)使用figure

检索原始图例数据

4.5)在guidata guidata中存储axes创建的句柄以替换原始图例

4.6)存储数字的guidata

在下文中,整个更新的代码 - 上述步骤在代码中标记为

guidata

绘图的原始代码

figure

图的ResizeFnc

axes

希望这有帮助,

Qapla'