2016-10-23 2 views
0

Ich habe ein großes Grafikprojekt debuggen und schließlich das Problem in den folgenden MWE reduziert. Irgendwie kehrt MATLAB's copyobj die Reihenfolge der Grafikobjekte um, wenn sie in eine neue Figur kopiert werden.MATLAB copyobj kehrt die Reihenfolge der Objekte um?

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; 

gibt

enter image description here

Da die grüne Linie erwartet, die später auf der Oberseite ist der rote Linie gezogen wurde. Dann kopiere ich diese zwei Zeilen in eine neue Figur.

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

gibt

enter image description here

Nun ist die rot über dem grün.

Kennt jemand den Grund dafür? Kann ich die Reihenfolge der Objekte einfach umkehren, damit die Bestellung korrekt ist?

Antwort

2

copyobj kopiert die Objekte in umgekehrter Reihenfolge.
Um die richtige Reihenfolge zu erhalten, verwenden copyobj(lines(end:-1:1), a); oder copyobj(fliplr(lines), a); statt copyobj(lines, a);


Eine Beratung über Ihren Code: -
Statt bei jeder Iteration die Größe lines wächst, pre-allocate es wie gezeigt unten:

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

Lesen Sie die Dokumentation von gobjects() und Graphics Arrays für Details.

und die Schleife bei Verwendung für Sie nicht erforderlich ist, können Sie einfach die folgenden Befehle verwenden:

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