matlab中图例标记的高级定制

matlab中图例标记的高级定制,matlab,customization,legend,Matlab,Customization,Legend,在matlab图例中为标记添加基本修改相对简单。由以下代码段()生成的图例: 等一下 h=绘图(inf,inf,'ob',inf,inf,'r+'); 图例(h、'Data1'、'Data2') 可以使用以下代码轻松修改为: [~,~,图标,~]=图例(h,'Data1','Data2'); 设置(图标(1),“线条样式”和“-”) 设置(图标(2),“线条样式”和“-”) 但是,如果我想正确地推断物体,例如(圆不是在直线的中间)或者(一行上的几个颜色加上“+”标记),事情就会变得相当复杂。我没

在matlab图例中为标记添加基本修改相对简单。由以下代码段()生成的图例:

等一下
h=绘图(inf,inf,'ob',inf,inf,'r+');
图例(h、'Data1'、'Data2')

可以使用以下代码轻松修改为:

[~,~,图标,~]=图例(h,'Data1','Data2');
设置(图标(1),“线条样式”和“-”)
设置(图标(2),“线条样式”和“-”)

但是,如果我想正确地推断物体,例如(圆不是在直线的中间)或者(一行上的几个颜色加上“+”标记),事情就会变得相当复杂。我没有找到任何允许修改图例框中标记位置或在一个图例组中添加多个标记的属性或解决方法


有人知道包含图例自定义高级信息的文档吗?或者如何更好地利用matlab提供的图形对象的众多属性来实现上述功能?

在R2014a之前的matlab版本中,
图例
框实际上是一个
,因此通过其句柄修改其内容相对容易

从版本
R2014b
看,
图例是一个
图形对象
,似乎无法访问轴手柄(参见)

高达R2014a

给定绘图中两条线的图例:

h = plot((0:.1:2*pi),sin((0:.1:2*pi)),'ob',(0:.1:2*pi),cos((0:.1:2*pi)),'r+');
[a,b,icons,c] = legend(h,'Data1','Data2');
  • a是图例axex的手柄
  • b是Handel的数组:
    • b(1):第一个字符串的句柄
    • b(2):第二个字符串的句柄
    • b(3):第一行的手柄
    • b(4):第一行标记的手柄
    • b(5):第二行的手柄
    • b(6):第二行标记的手柄
如果要将第一行上的
标记
移动到行的末尾,例如,可以:

  • 获取行的扩展数据(存储在
    b(3)
    中):它是一个(1x2)数组
  • 标记
    (存储在
    b(4)
    中)的
    扩展数据
    设置为在上述步骤中获得的数组的最后一个值
如果要添加更多的
标记
,并使第二行由更多不同颜色的线段组成,可以:

  • 获取行的
    XData
    YData
    (存储在
    b(5)
    中)
  • 通过拆分扩展数据数组生成
    x坐标
  • 使用
    YData
    值作为
    y坐标
这种方法已在以下代码中实现,其中图例框也被放大,以使其更“可读”

代码中的注释应该解释不同的步骤

% Plot something
h = plot((0:.1:2*pi),sin((0:.1:2*pi)),'ob',(0:.1:2*pi),cos((0:.1:2*pi)),'r+');
% Add trhe legend
[a,b,icons,c] = legend(h,'Data1','Data2');
%
% a ==> handle of the legend axes
% b(1) ==> handle of the first string
% b(2) ==> handle of the second string
% b(3) ==> handle of the first line
% b(4) ==> handle of the marker of the first line
% b(5) ==> handle of the second line
% b(6) ==> handle of the marker of the second line
%
% Get positin and size of the legend box
ax_p=get(a,'position')
% Enlarge the legend box
set(a,'position',[ax_p(1)-.2 ax_p(2) ax_p(3)+.2 ax_p(4)])
% Set the linestyle of the first element on the legend
set(b(3),'linestyle','-')
% Get the XData of the first line
xl_1=get(b(3),'xdata')
% Move the marker of the first line to the end of the line
set(b(4),'xdata',xl_1(2))
% Get the position of the first string
xs_1=get(b(1),'position')
% Move the first string
set(b(1),'position',[xs_1(1)+.2 xs_1(2) xs_1(3)])
% Get the position of the second string
xs_2=get(b(2),'position')
% Move the second string
set(b(2),'position',[xs_2(1)+.2 xs_2(2) xs_2(3)])
% Split the second line in multi-color segment and add more marker on the
% second line
%
% Define the number of segments
n=4;
% Get the XData of the first line
xl_2=get(b(5),'xdata')
% Get the YData of the first line
yl_2=get(b(5),'ydata')
% Define the segments
len=linspace(xl_2(1),xl_2(2),n+1);
% Plot the segments of the second line in different colours
for i=1:n
   plot(a,[len(i) len(i+1)],[yl_2(1) yl_2(2)], ...
      'marker',get(b(6),'marker'),'markeredgecolor', ...
      get(b(6),'markeredgecolor'),'markerfacecolor',get(b(6),'markerfacecolor'), ...
      'color',rand(1,3),'linewidth',2)
end
% Plot something
h = plot((0:.1:2*pi),sin((0:.1:2*pi)),'o-',(0:.1:2*pi),cos((0:.1:2*pi)),'r+-');
% Add the legend
[a,b,icons,c] = legend(h,'Data1','Data2');
% Add an axes to the figure
ax=axes;
% Enlarge the legend, then set the axes position and size equal to the
% legend box
%Get the legend's position and size
ax_p=a.Position;
a.Position=[ax_p(1)-.2 ax_p(2) ax_p(3)+.2 ax_p(4)];
ax.Position=a.Position;
ax.Units='normalized';
ax.Box='on';
% Plot the firt line in the axes
plot(ax,b(3).XData,b(3).YData,'color',b(3).Color);
hold on
% Add the marker of the first line at the end of the line
plot(ax,b(3).XData(end),b(3).YData(end), ...
             'marker',b(4).Marker, ...
             'markeredgecolor',b(4).Color, ...
             'markerfacecolor',b(3).MarkerFaceColor);
% Get second line XData and YData
x=b(5).XData;
y=b(5).YData;
% Define the number of line sections
n=5;
% Update the XData and YData by defning intermediate values
len=linspace(x(1),x(2),n);
% Plot the set of line with different colours
for i=1:n-1
   plot(ax,[len(i) len(i+1)],[y(2) y(2)], ...
      'marker',b(6).Marker,'markeredgecolor',b(6).Color, ...
      'markerfacecolor',b(6).MarkerFaceColor, ...
      'color',rand(1,3),'linewidth',1.5);
end
% Get the legend texts position
pt1=b(1).Position;
pt2=b(2).Position;
% Add the legend text
text(pt1(1)+.1,pt1(2),a.String{1});
text(pt2(1)+.1,pt2(2),a.String{2});
% Remove the axes ticks
ax.XTick=[];
ax.YTick=[];
% Set the axes limits
ax.XLim=[0 1];
ax.YLim=[0 1];
结果是:

来自R2014b

由于似乎无法访问图例axex,因此可以(如上文所述)添加
并将其叠加到图例中

您可以首先创建图例:

h = plot((0:.1:2*pi),sin((0:.1:2*pi)),'o-',(0:.1:2*pi),cos((0:.1:2*pi)),'r+-');
[a,b,icons,c] = legend(h,'Data1','Data2');
  • a是
    matlab.graphics.插图.Legend
    的对象(请尝试
    class(a)
  • b是
    matlab.graphics.primitive.Data
    对象的数组(请尝试
    class(b)
与旧版本类似,
b
指的是:

  • b(1):第一个字符串
  • b(2):第二串
  • b(3):第一行
  • b(4):第一行的标记
  • b(5):第二行
  • b(6):第二行的标记
您可以通过
legend
对象
a
获取
legend
位置和
大小

然后,您可以采用上述相同方法绘制“更新”图例

此方法已在以下代码中实现(注释应解释不同的步骤)

希望这有帮助


Qapla'

Qapla',非常感谢您花时间写下如此详尽而清晰的答案。感谢您提供的一般信息,也感谢您提供的更个性化的建议。我希望我能给您100票赞成票!不客气!很高兴我对您有用!这是一个非常有趣的问题。对于R2014b+语法,文档说明
[lgd,icons,plots,txt]=图例(…)
。实际名称并不重要,但移动输出
图标的位置有点混乱。第三个输出参数(
plots
)是图例所指轴中图形对象的句柄。第二个输出(
icons
),正如您在这里所说,是用于绘制图例本身的东西的句柄。