2016-10-23 2 views
0

Я отлаживал большой графический проект и, наконец, уменьшил проблему до следующего MWE. Как-то MATLAB's copyobj меняет порядок графических объектов, когда он копирует их на новый рисунок.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; 

дает

enter image description here

Как и следовало ожидать, зеленая линия, которая была разработана позже на вершине красной линии. Затем я копирую эти две строки в новую фигуру.

figure; 
a = axes; 
copyobj(lines, a); 
view(a); 

дает

enter image description here

Теперь красный над зеленым.

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

ответ

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); 
Смежные вопросы