Matlab中的高级绘图(图例处理)

时间:2017-03-11 21:33:39

标签: matlab legend

我想在我的情节中添加一个图例,使其看起来像在图片中(减少线条的长度并抑制不必要的空格)

enter image description here

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',14);
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')

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

正如MatLab online documentation 在R2014b中所述,色条和图例不再是轴对象

这限制了可能在legend上工作以实现目标的可能性。

可能的解决方案是按照以下步骤创建您自己的图例:

  • 使用以下语法legend创建调用[lgd,icons,plots,txt] = legend(___)函数的图例(注意,此语法不推荐但是,我们将删除下一个的图例步骤,所以这不会有问题)
  • 获取传奇的位置
  • 识别图例中的项目数

    • 对于图表中的每一行,图例中有三个项目(linemarkertext
    • 如果图表中有六行,则图例句柄将按以下顺序包含18个对象:

      • 6 x处理text
      • 对于6行中的每一行
        • 该行的句柄
        • 标记的1个句柄
  • 获取图例中项目的数据:
    • 行数据:XDataYDataColor,'LineStyle`
    • 文字数据:stringposition
  • 删除原始图例
  • 在图中添加axes,其位置和大小等于原始图例
  • 在此轴上绘制代表图例的线条(您已获得前面步骤的数据)
  • 缩小线条,只减少减少XData
  • 的第二个元素的值
  • 将图例文本对应添加到该行(使用text功能。由于在上一步中您已经恢复了您要在文本左侧移动的行的长度
  • 缩小axes的大小:
    • 您可以使用Extent项的text属性来识别较长的项目的长度
    • 然后添加相应行的长度
  • 使用上述步骤中计算的值更新axes位置(width

这是一种可能的实现(基于您的代码):

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)]

enter image description here

希望这有帮助,

Qapla'