如何在Matlab图中添加一个两列的图例?

12
考虑以下代码:
t=0:.01:(2*pi);
y=[sin(t);sin(t-pi/12);sin(t-pi/6);sin(t-pi/4)];
figure(1)
    clf
    subplot(6,1,5)
    plot(t,y)
    xlim([0 2*pi])
    legend('1','2','3','4')

它生成以下图形:

![enter image description here

有没有办法将图例改为两列布局?这样就会是
--- 1 --- 3 --- 2 --- 4
而不是
--- 1 --- 2 --- 3 --- 4
这样图例边界线就不会穿过图形边界线了。
我找到了gridLegend脚本,但我更喜欢直接编码。

4
不确定是否可以使用正统方法,但这是一个非常有趣的问题。可能有人可以入侵Java并完成它。可能gridLegend是最好的选择。 - Ander Biguri
1
如果你想直接编码,那就跟着 gridLegend 的步骤实现它。 - sco1
3
我建议你直接使用 gridLegend。重新发明轮子没有任何意义。 - nirvana-msu
2
legend('1','2','3','4','Orientation','horizontal')怎么样,这样图例就不会跨越坐标轴的边界了?这可能不能解决你的问题,但可能是你问题的一个简单解决方案。 - Matt
1
除了gridlegend之外,还有columnlegend:http://www.mathworks.com/matlabcentral/fileexchange/27389-columnlegend - optimist
显示剩余3条评论
2个回答

7

MATLAB自2018a版本开始支持在图例中显示多列。只需在legend()命令的末尾添加'NumColumns',desired_number即可。

详情请见此处 - https://www.mathworks.com/help/matlab/ref/legend.html?lang=en&s_tid=gn_loc_drop#bt6r30y

此外,还可以将图例顺序由上至下改为从左到右。

默认情况下,图例会按列从上到下对项目进行排序。若要改为每行从左到右排序,请将Orientation属性设置为“horizontal”。


1

你通常可以通过在第一个轴的顶部创建第二个不可见轴来解决这种问题,方法如下:

t=0:.01:(2*pi);
y=[sin(t);sin(t-pi/12);sin(t-pi/6);sin(t-pi/4)];
figure
subplot(6,1,5)

plot(t,y)
xlim([0 2*pi])
l1 = legend('1', '2');
pos = l1.Position;
set(l1, 'Position', pos - [pos(3) 0 0 0]);
legend boxoff

ax2 = copyobj(gca, gcf);
set(ax2, 'visible', 'off', 'clipping', 'off')
kids = ax2.Children;
set(kids, 'visible', 'off', 'clipping', 'off')
set(ax2, 'children', kids([3:4 1:2]))
l2 = legend(ax2, '3', '4');
legend(ax2, 'boxoff')
legend boxoff

请注意,这是脆弱的(例如,在我的MATLAB版本中无法处理窗口调整大小)。

有趣的技巧。确实可以改进,使得每个图形窗口大小的两个图例高度相同。 - Karlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接