循环绘图、标记和图例

Plotting, marking and legend in a loop

我想绘制一个图表,标记一个点并循环编写图例。

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);

标签不起作用,因为它只需要第一个元素而忽略了额外的元素。整个方法一团糟,颜色代码都乱七八糟,有没有优雅的方法可以让我的图例颜色与情节颜色相匹配

您需要将 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,因为那是内置 MATLAB.

另一种方法是使用 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' 以便您仍然可以在构建绘图后更改和查询它即使您没有像我上面那样明确设置它。但是,我发现这种方法是自我记录的并且更方便,因为它减少了一件需要跟踪的事情。