在MatLab版本中,直到R2014a,图例框实际上是一个轴(axes),因此通过其句柄相对容易地修改其内容。
从版本R2014b开始,图例是一个图形对象(graphics object),似乎没有办法访问轴的句柄(参考这个帖子:
this post on undocumentedmatlab)。
截至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是图例轴的句柄
- b是一个句柄数组:
- b(1): 第一个字符串的句柄
- b(2): 第二个字符串的句柄
- b(3): 第一条线的句柄
- b(4): 第一条线的标记句柄
- b(5): 第二条线的句柄
- b(6): 第二条线的标记句柄
如果您想将第一条线上的标记移动到该行的末尾,可以:
- 获取该行的XData(存储在b(3)中):它是一个(1x2)数组
- 将标记的XData(存储在b(4)中)设置为上述步骤获得的数组的最后一个值
如果您想添加更多的标记,并且使第二条线由不同颜色的多个线段组成,可以:
- 获取线条的
XData
和YData
(存储在b(5)
中)
- 通过拆分
XData
数组生成x coord
- 使用
YData
值作为y coord
在for
循环中绘制线段
这种方法已经在以下代码中实现,图例框也已被放大,使其更易读。
代码中的注释应该解释了不同的步骤。
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');
ax_p=get(a,'position')
set(a,'position',[ax_p(1)-.2 ax_p(2) ax_p(3)+.2 ax_p(4)])
set(b(3),'linestyle','-')
xl_1=get(b(3),'xdata')
set(b(4),'xdata',xl_1(2))
xs_1=get(b(1),'position')
set(b(1),'position',[xs_1(1)+.2 xs_1(2) xs_1(3)])
xs_2=get(b(2),'position')
set(b(2),'position',[xs_2(1)+.2 xs_2(2) xs_2(3)])
n=4;
xl_2=get(b(5),'xdata')
yl_2=get(b(5),'ydata')
len=linspace(xl_2(1),xl_2(2),n+1);
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
这是结果:
![enter image description here](https://istack.dev59.com/21kFO.gif)
从 R2014b 开始
由于似乎无法访问图例轴,因此可以采用以下建议(在上述 post 中提到)添加一个 axes
并将其叠加到图例中。
首先,您可以创建图例:
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.illustration.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
的position
和size
。
然后,您可以按照上面描述的相同方法来绘制“更新”的图例。
此方法已在以下代码中实现(注释应解释不同的步骤)。
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');
ax=axes;
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(ax,b(3).XData,b(3).YData,'color',b(3).Color);
hold on
plot(ax,b(3).XData(end),b(3).YData(end), ...
'marker',b(4).Marker, ...
'markeredgecolor',b(4).Color, ...
'markerfacecolor',b(3).MarkerFaceColor);
x=b(5).XData;
y=b(5).YData;
n=5;
len=linspace(x(1),x(2),n);
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
pt1=b(1).Position;
pt2=b(2).Position;
text(pt1(1)+.1,pt1(2),a.String{1});
text(pt2(1)+.1,pt2(2),a.String{2});
ax.XTick=[];
ax.YTick=[];
ax.XLim=[0 1];
ax.YLim=[0 1];
希望这有所帮助。
Qapla'
[lgd,icons,plots,txt] = legend(...)
。实际名称并不重要,但移动输出参数icons
的位置有点令人困惑。第三个输出参数(plots
)是图轴中与图例相关的图形对象的句柄。正如你在这里所说的,第二个输出(icons
)是用于绘制图例本身的句柄。 - Cris Luengo