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