MATLAB copyobj изменяет порядок объектов?

#matlab #matlab-figure

#matlab #matlab-рисунок

Вопрос:

Я отлаживал большой графический проект и, наконец, свел проблему к следующему 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);
  

выдает

введите описание изображения здесь

Теперь красный цвет находится над зеленым.

Кто-нибудь знает причину этого? Чтобы получить правильный порядок, могу ли я просто изменить порядок объектов?

Ответ №1:

copyobj копирует объекты в обратном порядке.
Чтобы получить правильный порядок, используйте copyobj(lines(end:-1:1), a); или copyobj(fliplr(lines), a); вместо copyobj(lines, a);


Совет по вашему коду:-

Вместо увеличения размера lines на каждой итерации, предварительно выделите его, как показано ниже:

 lines = gobjects(1,2);
for idx = 1:size(X, 2)
    lines(idx) = plot(X(:, idx), Y(:, idx), 'Color', colors(idx, :), 'linewidth', 10);
end
  

Подробнее читайте документацию по gobjects() и графическим массивам.

И если использование цикла для вас не является обязательным, вы можете просто использовать следующее:

 % Following is to set the Colors that you specified
set(gca, 'ColorOrder', colors);
% Now plotting the data 
lines = plot(X,Y,'linewidth',10 );