2011-09-06 62 views
6

當您設置DefaultAxesColorOrderDefaultAxesLineStyleOrder MATLAB將首先循環顯示所有具有第一種樣式的顏色,然後再循環顯示具有第二種樣式的所有顏色,依此類推。MATLAB:設置要並行應用的線條顏色和樣式順序

看到這個documentationrelated question

我想要做的是設置獨立應用的顏色順序和樣式順序。

例如,如果我設置DefaultAxesColorOrder[1 0 0; 0 1 0; 0 0 1]DefaultAxesLineStyleOrder'-|--|:',該線將'r-''g-''b-''r--''g--''b--''r:''g:''b:'。我想要的行是'r-''g--''b:'

回答

4

我沒有看到直接開箱即用的方法。直接的方法是爲每一行手動設置顏色/樣式。

這是一個更加自動化的解決方案。讓我們開始從文檔中取一個例子:

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

正如你解釋你的問題,默認行爲是通過色彩週期,再行樣式。如果你想單獨應用它們,請嘗試以下操作:

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

你也許可以包裝在方便訪問的功能(你還必須把手傳遞到線圖形對象):

function applyColorLineStyleIndependently(h) 
    %# ... 
end 

enter image description here

+0

將它們縮放到[0,1]非常感謝!這很棒!我從來沒有在'set'中使用單元格數組。 – yuk

0

Amro的方法運作良好。就像一個筆記一樣,你不需要設置默認值就可以做到這一點。你可以這樣做

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) 

編輯:mycolors()函數是自制的。我定義了

colors.maroon = [128,0,0]; 
colors.dark_red = [139,0,0]; 
colors.brown = [165,42,42]; 
... 

(顏色名稱來自於此http://www.rapidtables.com/web/color/RGB_Color.htm)。然後我通過

c = fieldnames(colors); 
for i = 1:numel(c) 
    colors.(c{i}) = colors.(c{i})/255; 
end 
+0

謝謝。什麼是mycolors功能?我沒有在MATLAB或FileExchange中找到它。它是你自己的代碼嗎? – yuk