MATLAB: Die Farbe und den Stil der Set Line, um parallel angewendet zu werden
Frage
Wenn Sie setzen DefaultAxesColorOrder
und DefaultAxesLineStyleOrder
MATLAB wird zuerst mit dem ersten Stil alle Farben durchlaufen, dann wieder durch alle Farben mit dem zweiten Stil und so weiter.
Sieh dir das an Dokumentation oder Verwandte Frage.
Was ich gerne tun möchte, ist Farbreihenfolge und Stilreihenfolge festzulegen, um unabhängig angewendet zu werden.
Zum Beispiel, wenn ich festgelegt habe DefaultAxesColorOrder
zu [1 0 0; 0 1 0; 0 0 1]
und DefaultAxesLineStyleOrder
zu '-|--|:'
, die Linien werden sein 'r-'
,'g-'
,'b-'
,'r--'
,'g--'
,'b--'
,'r:'
,'g:'
,'b:'
. Ich möchte Zeilen sein 'r-'
,'g--'
,'b:'
.
Lösung
Ich sehe keinen Weg, dies direkt aus der Box zu tun. Der unkomplizierte Weg besteht darin, die Farbe/den Stil für jede Zeile manuell einzustellen.
Hier ist eine automatisierte Lösung. Beginnen wir mit einem Beispiel aus der Dokumentation:
%# defaults are set sometime before
set(0, 'DefaultAxesColorOrder',[1 0 0;0 1 0;0 0 1], ...
'DefaultAxesLineStyleOrder','-|--|:')
%# do plotting as usual
t = 0:pi/20:2*pi;
a = zeros(length(t),9);
for i = 1:9
a(:,i) = sin(t-i/5)';
end
h = plot(t,a);
Wie Sie in Ihrer Frage erklärt haben, besteht das Standardverhalten darin, zuerst die Farben und dann die Linienstile durchzuführen. Wenn Sie sie unabhängig beantragen möchten, versuchen Sie es mit Folgendem:
c = num2cell(get(0,'DefaultAxesColorOrder'),2);
l = cellstr(get(0,'DefaultAxesLineStyleOrder'));
set(h, {'Color'}, c(rem((1:numel(h))-1,numel(c))+1), ...
{'LineStyle'}, l(rem((1:numel(h))-1,numel(l))+1))
Möglicherweise können Sie diese in einer Funktion für einen bequemen Zugriff einwickeln (Sie müssen die Griffe weiterhin an die Grafikobjekte der Linien übergeben):
function applyColorLineStyleIndependently(h)
%# ...
end
Andere Tipps
Amros Ansatz funktioniert gut. Nur als Notiz müssen Sie die Standardeinstellungen dafür nicht festlegen. Sie können so etwas tun
col = mycolors(); % defines RGB colors scaled to [0,1]
i = 1;
c(:,i) = col.royal_blue; i = i+1;
c(:,i) = col.crimson; i = i+1;
c(:,i) = col.medium_sea_green; i = i+1;
c(:,i) = col.coral; i = i+1;
c(:,i) = col.dark_magenta; i = i+1;
colord = num2cell(c',2);
lineord = {'-' '--' '-.'}';
set(h,{'Color'}, colord(rem((1:numel(h))-1,numel(colord))+1), ...
{'LineStyle'}, lineord(rem((1:numel(h))-1,numel(lineord))+1))
set(h,'LineWidth',2)
Bearbeiten: Die Funktion mycolors () ist zu Hause gemacht. Ich definiere
colors.maroon = [128,0,0];
colors.dark_red = [139,0,0];
colors.brown = [165,42,42];
...
(Die Farbnamen stammen daraus http://www.rapidtables.com/web/color/rgb_color.htm). Dann skalle ich sie über [0,1] über
c = fieldnames(colors);
for i = 1:numel(c)
colors.(c{i}) = colors.(c{i})/255;
end