在Matlab图例中获取多个标题或标题

时间:2017-03-30 09:28:05

标签: matlab legend

我有以下脚本为几个实验产生一种散点图。 实验给出了两个结果,一方面是向量s,另一方面是向量C2007C2012O2012O2015。这4个向量显示了不同的时间。 exerpiments本身在test1单元格中标记为test2test3n等等。

下图显示了脚本的输出:

Too long legend

问题有两个:一方面,图例太长,但使用Columnlegend会占用太多空间。另一方面,像“test1”,“test2”等字符串被重复,并没有按照使用的形状分类,代表不同的时间(如C2007, C2012, O2012, O2015)。因此,如果有一个,那就太好了是否有可能使图例中的以下几点属于矢量。为了展示我真正想要的东西,我用Paint绘制了草图:

第一种可能性:

Still long legend

这样可以解决形状没有分类但传说太长的问题。

因此,一个完全不同的方法也会使用一个不在图中的形状来显示哪个颜色属于哪个测试,然后只显示哪个形状属于哪个实验日期,再次使用Paint的小草稿来显示我的内容有想象的事情:

enter image description here

可悲的是,我不知道如何在这种情况下实现这种行为,例如具有特定颜色(来自颜色矢量)和特定形状。任何帮助都非常感谢

close all;

s = [67,3,7,21,2,58,19,5]
colors = [0 0 0; 1 0 0 ;1 0 0.5; 1 0 1; 1 0.5 0; 1 0.5 0.5; 1 0.7 0; 0.7 0.7 0.5];
n = {'test1','test2','test3', 'test4', 'test5','test6','test7', 'test8'}

C2007 = [1.8, NaN, 7.2,3.8,2.44,2.1,7,NaN];
C2012 = [NaN, 6, 5.9, 2.5, NaN, 5.8, 8.1, NaN];
O2012 = [4,9.5,8.8, NaN, NaN, 1.2,4.5, NaN];
O2015 = [NaN, NaN, NaN, NaN, NaN, 2.8 4.4, 7.1];

figure;

for i=1:length(s)
   hplot1 = plot(s(i),C2007(i),'*','LineWidth',100,'Color',colors(i,:),'DisplayName',char(n(i)));
   legOBJ1 = legend('-DynamicLegend')  
   hold all;
end


for i=1:length(s)
   hplot2 = plot(s(i),C2012(i),'+','LineWidth',100,'Color',colors(i,:),'DisplayName',char(n(i)));
   legend('-DynamicLegend')
end


for i=1:length(s)
   hplot3 = plot(s(i),O2012(i),'o','LineWidth',100,'Color',colors(i,:),'DisplayName',char(n(i)));
   legend('-DynamicLegend')
end


for i=1:length(s)
   hplot4 = plot(s(i),O2015(i),'^','LineWidth',100,'Color',colors(i,:),'DisplayName',char(n(i)));
   legend('-DynamicLegend')
end

grid on

1 个答案:

答案 0 :(得分:0)

以下代码将提供一种实现第二个更好点的hackish方式。

为此,在所示图形之外绘制了具有所需特征的点。为了制作标题,线条的颜色设置为白色,因此无法在图例中看到它。

close all;

s = [67,3,7,21,2,58,19,5]
colors = [0 0 0; 1 0 0 ;1 0 0.5; 1 0 1; 1 0.5 0; 1 0.5 0.5; 1 0.7 0; 0.7 0.7 0.5];
n = {'test1','test2','test3', 'test4', 'test5','test6','test7', 'test8'}

C2007 = [1.8, NaN, 7.2,3.8,2.44,2.1,7,NaN];
C2012 = [NaN, 6, 5.9, 2.5, NaN, 5.8, 8.1, NaN];
O2012 = [4,9.5,8.8, NaN, NaN, 1.2,4.5, NaN];
O2015 = [NaN, NaN, NaN, NaN, NaN, 2.8 4.4, 7.1];

figure;

for i=1:length(s)
   hplot1 = plot(s(i),C2007(i),'*','LineWidth',100,'Color',colors(i,:)); 
   hold on;
end


for i=1:length(s)
   hplot2 = plot(s(i),C2012(i),'+','LineWidth',100,'Color',colors(i,:));
end


for i=1:length(s)
   hplot3 = plot(s(i),O2012(i),'o','LineWidth',100,'Color',colors(i,:));

end


for i=1:length(s)
   hplot4 = plot(s(i),O2015(i),'^','LineWidth',100,'Color',colors(i,:));

end

grid on

%Just stupid plots for overview
h1 = plot(-5,-5,'Color',[1 1 1]) %white dot, so that it will not be shown on
                                 %legend
h2 = plot(-5,-5,'*','LineWidth',100,'Color',[0.5 0.5 0.5]);
h3 = plot(-5,0,'+','LineWidth',100,'Color',[0.5 0.5 0.5]);
h4 = plot(-5,-5,'o','LineWidth',100,'Color',[0.5 0.5 0.5]);
h5 = plot(-5,-5,'^','LineWidth',100,'Color',[0.5 0.5 0.5]);
h6 = plot(-5,-5,'Color',[1 1 1])

for i=1:length(colors)
    hh(i) = plot(0,0,'-','Color',colors(i,:),'LineWidth',10);
end

%set boundaries to not show hack
xlim([0 100]);
ylim([0 12]);
legend([h1,h2,h3,h4,h5,h6,hh(1),hh(2),hh(3),hh(4),hh(5),hh(6),hh(7),hh(8)],{'Timing:','C2007','C2012','O2012','O2015','Tests: ', 'test1','test2','test3', 'test4', 'test5','test6','test7', 'test8'})