我正在调试一个大型图形项目,最后将问题减少到以下MWE中。不知怎的,MATLAB的copyobj
在将图形对象复制到新图形时会反转图形对象的顺序。
X = [1 2; 4 4];
Y = [2 -4; -4 2];
figure;
hold on;
colors = [1 0 0; 0 1 0];
lines = [];
for idx = 1:size(X, 2)
l = plot(X(:, idx), Y(:, idx), 'Color', colors(idx, :), 'linewidth', 10);
lines = [lines l];
end
hold off;
给出
正如预期的那样,后面绘制的绿线位于红线上方。然后我将这两行复制成一个新的数字。
figure;
a = axes;
copyobj(lines, a);
view(a);
给出
现在红色在果岭上方。
有人知道这背后的原因吗?为了使订单正确,我可以反转对象顺序吗?
答案 0 :(得分:2)
copyobj
以相反的顺序复制对象。
要获得正确的订单,请使用copyobj(lines(end:-1:1), a);
或copyobj(fliplr(lines), a);
代替copyobj(lines, a);
对您的代码提出建议:
而不是在每次迭代时增加lines
的大小, pre-allocate ,如下所示:
lines = gobjects(1,2);
for idx = 1:size(X, 2)
lines(idx) = plot(X(:, idx), Y(:, idx), 'Color', colors(idx, :), 'linewidth', 10);
end
阅读gobjects()
和Graphics Arrays的文档了解详情。
如果您不需要使用循环,则只需使用以下内容:
% Following is to set the Colors that you specified
set(gca, 'ColorOrder', colors);
% Now plotting the data
lines = plot(X,Y,'linewidth',10 );