我想绘制图形,标记点并在循环中写入图例。
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);
标签不起作用,因为它只需要忽略额外元素的第一个元素。并且整个方法都是混乱的颜色代码搞砸了,有没有优雅的方式这样做我的传奇颜色与情节颜色匹配
答案 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)
作为附注,最好不要使用i
或j
作为循环变量,也不要将变量error
命名为&{ #39;是内置MATLAB的名称。