在循环中绘制,标记和图例

时间:2016-08-29 13:49:14

标签: matlab plot legend

我想绘制图形,标记点并在循环中写入图例。

labels = {}
for i = 1: size(error,1)
    r =  plot(handles.axes1,temp(i).time,temp(i).signal);
    hold (handles.axes1, 'on')
    a = %find minimum index 
    xmin = temp(i).time(a);
    ymin = temp(i).signal(a);
    plot(handles.axes1,xmin,ymin,'ro')
    labels{end+1} = sprintf('Type : %s, %f,%f',error{i,1}.main(1,1).type,xmin,ymin)
end

grid on
legend(r, labels);

标签不起作用,因为它只需要忽略额外元素的第一个元素。并且整个方法都是混乱的颜色代码搞砸了,有没有优雅的方式这样做我的传奇颜色与情节颜色匹配

2 个答案:

答案 0 :(得分:4)

另一种方法是使用DisplayName关键字。

for i = 1:N_lines
    %...
    r(i) = plot(handles.axes1, temp(i).time, temp(i).signal, 'DisplayName', labels{i});
    %...
end
legend('show')

这样做的好处是它将名称直接附加到绘图点。如果您正在调试,并在绘图浏览器中打开绘图,则在绘制每个点时,名称将显示在右侧窗格中的点旁边。您也不需要跟踪单独的labels变量,以防您最后因某种原因重新排序积分。这样,标签总是随着它们的关联点一起移动。

我应该补充一点,当您使用标签单元调用legend命令时,它会回填'DisplayName',这样即使构建了绘图,您仍然可以更改并查询它你没有像我上面那样明确地设置它。但是,我发现这种方法可以自我记录并且更方便,因为跟踪它的方法要少一些。

答案 1 :(得分:3)

您需要将r设为数组。实际上,您只存储了最后一个情节句柄,因此当您致电legend时,它只会使用最后一个情节和第一个标签。

% Create a unique color for each plot
colors = hsv(size(error, 1));

for i = 1:size(error, 1)
    r(i) =  plot(handles.axes1,temp(i).time,temp(i).signal, 'Color', colors(i,:));
    %...
    labels{i} = sprintf('Type : %s, %f,%f',error{i,1}.main(1,1).type,xmin,ymin);
end

legend(r, labels)

作为附注,最好不要使用ij作为循环变量,也不要将变量error命名为&{ #39;是内置MATLAB的名称。