如何在MATLAB图例

时间:2018-06-12 05:27:26

标签: matlab matlab-figure

我的图像如下。

enter image description here 在这个图像中你可以看到3行,这些实际上是6行,一行是隐形的,只是用于显示标记而另一行是原始数据点的平滑版本。现在的问题是如何在图例中获取标记。在这种情况下,您可以看到图形图例仅包含线条,而不是标记。我的代码如下。

clc; clear all ;

colour_green = [12 195 82] ./ 255;
colour_lightgreen = [94 250 81] ./ 255;
colour_lightblue = [8 180 238] ./ 255;
colour_darkblue = [1 17 181] ./ 255;
colour_peach = [251 111 66] ./ 255;

figure('DefaultAxesFontSize',30);
set(0,'DefaultAxesFontName',' Times  ');
hold on 


time_window = xlsread('pattern_data.xlsx', 'effect_of_count', 'A2:A12');
count1plus = xlsread('pattern_data.xlsx', 'effect_of_count', 'B2:B12');
count10plus = xlsread('pattern_data.xlsx', 'effect_of_count', 'C2:C12');
count1to5 = xlsread('pattern_data.xlsx', 'effect_of_count', 'D2:D12');


 x1 = 50:1:99;
%  x1 = .01:.01:.5;


x2 = interp1(time_window,count1plus,x1, 'pchip') ;
x3 = interp1(time_window,count10plus,x1, 'pchip') ;
x4 = interp1(time_window,count1to5,x1, 'pchip') ;


   % count 1+
plot(x1,x2,'b--','DisplayName', 'Count_{A} = 1: and Count_{B} = 1:','LineWidth',3) 
plot(time_window,count1plus,'bs', 'HandleVisibility','off','LineWidth',5)

   % count 1:5
plot(x1,x4,'-','DisplayName', 'Count_{A} = 1: and Count_{B} = 5:','LineWidth',3 ,  'Color', colour_green) 
plot(time_window,count1to5,'^', 'HandleVisibility','off','LineWidth',5 ,  'Color', colour_green)

   % count 10+
plot(x1,x3,'r--','DisplayName', 'Count_{A} = 1: and Count_{B} = 10:','LineWidth',3) 
plot(time_window,count10plus,'ro', 'HandleVisibility','off','LineWidth',5)


hold off


xlabel('Th_{B} ')
ylabel('L (milliseconds)')
legend('Location','north')
legend show

set(gcf, 'PaperUnits', 'normalized');
set(gcf, 'PaperPosition', [0 0 1 1]);
set(gcf,'PaperOrientation','l');
print -dpng graphs/p1_effect_of_count_and_selB;

请帮忙。我想要的是在相应的图例中有一个标记(圆形,方形等)。

编辑#1

提供的解决方案here没有解决我的问题,因为它没有说明如何添加标记。动画显示了如何自定义标记的位置,但在这里我想添加一个新标记,而不是重新定位原始标记。

1 个答案:

答案 0 :(得分:2)

this answer to a very similar question中所述,自R2014b开始,图例对象变得不透明,无法轻易更改。但是,该答案还表明the legend function有一个带有四个输出参数的语法,它以不同的方式创建图例,以便可以修改它。答案还说明了如何修改图例。我们将跟随他们的领导。

文档说明了这种语法:

  

不建议使用此语法。它会创建一个不支持某些功能的图例,例如添加图例标题。此外,当您从轴添加或删除数据系列时,图例不会自动更新。

但在这种情况下,这些问题不会给我们带来麻烦,所以我们会继续这样做。

如果是问题中的图表,我们将替换

legend('Location','north')

[lgd,icons,plots,txt] = legend('Location','north');

现在,icons包含构成图例的对象的句柄:

>> icons

icons = 

  9×1 graphics array:

  Text    (Count_{A} = 1: and Count_{B} = 1:)
  Text    (Count_{A} = 1: and Count_{B} = 5:)
  Text    (Count_{A} = 1: and Count_{B} = 10:)
  Line    (Count_{A} = 1: and Count_{B} = 1:)
  Line    (Count_{A} = 1: and Count_{B} = 1:)
  Line    (Count_{A} = 1: and Count_{B} = 5:)
  Line    (Count_{A} = 1: and Count_{B} = 5:)
  Line    (Count_{A} = 1: and Count_{B} = 10:)
  Line    (Count_{A} = 1: and Count_{B} = 10:)

显示甚至可以帮助显示哪些元素属于哪个项目。前三个是文本对象,后六个是行对象。这些行对象是我们需要修改的。

为什么图例中显示的每个项目都有两个线对象?那是因为有一个线对象(第一个)是渲染线(它有两个数据点):

>> icons(4)

ans = 

  Line (Count_{A} = 1: and Count_{B} = 1:) with properties:

              Color: [0 0 1]
          LineStyle: '--'
          LineWidth: 3
             Marker: 'none'
         MarkerSize: 6
    MarkerFaceColor: 'none'
              XData: [0.0108 0.0919]
              YData: [0.8246 0.8246]
              ZData: [1×0 double]

和另一个是标记(当前不可见,它有一个数据点):

>> icons(5)

ans = 

  Line (Count_{A} = 1: and Count_{B} = 1:) with properties:

              Color: [0 0 1]
          LineStyle: 'none'
          LineWidth: 3
             Marker: 'o'
         MarkerSize: 6
    MarkerFaceColor: 'none'
              XData: 0.0514
              YData: 0.8246
              ZData: [1×0 double]

所以,我们需要做的是设置这些标记对象:

icons(5).Marker = 's';
icons(7).Marker = '^';
icons(9).Marker = 'o';

现在情节看起来像你想要的。

我希望上面的描述足够清晰,您现在也可以通过其他方式更改图例。