2011-09-06 10 views
6

Khi bạn đặt DefaultAxesColorOrderDefaultAxesLineStyleOrder MATLAB trước tiên sẽ chuyển qua tất cả các màu với kiểu đầu tiên, sau đó lặp lại qua tất cả các màu với kiểu thứ hai và vân vân.MATLAB: đặt màu và thứ tự kiểu của dòng được áp dụng song song

Xem trang này documentation hoặc related question.

Điều tôi muốn làm là đặt thứ tự màu và thứ tự kiểu được áp dụng độc lập.

Ví dụ, nếu tôi đặt DefaultAxesColorOrder-[1 0 0; 0 1 0; 0 0 1]DefaultAxesLineStyleOrder-'-|--|:', các đường sẽ 'r-', 'g-', 'b-', 'r--', 'g--', 'b--', 'r:', 'g:', 'b:'. Tôi muốn các dòng là 'r-', 'g--', 'b:'.

Trả lời

4

Tôi không thấy cách thực hiện việc này trực tiếp từ hộp. Cách đơn giản là đặt màu/kiểu theo cách thủ công cho mỗi dòng.

Đây là giải pháp tự động hơn. Hãy bắt đầu bằng ví dụ được lấy từ tài liệu:

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

Như bạn đã giải thích trong câu hỏi của mình, hành vi mặc định là chuyển qua màu trước, sau đó là kiểu đường. Nếu bạn muốn áp dụng chúng một cách độc lập, hãy thử như sau:

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

Bạn có lẽ có thể bọc trong một chức năng để truy cập thuận tiện (bạn vẫn phải vượt qua xử lý với các dòng đối tượng đồ họa):

function applyColorLineStyleIndependently(h) 
    %# ... 
end 

enter image description here

+0

Cảm ơn rất nhiều! Thật tuyệt vời! Tôi không bao giờ sử dụng mảng ô trong 'bộ'. – yuk

0

Cách tiếp cận của Amro hoạt động tốt. Cũng giống như một lưu ý, bạn không phải đặt các giá trị mặc định để thực hiện việc này. Bạn có thể làm điều gì đó như thế này

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) 

Chỉnh sửa: chức năng mycolors() được tạo tại nhà. Tôi xác định

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

(tên màu là từ http://www.rapidtables.com/web/color/RGB_Color.htm) này. Sau đó, tôi chia tỷ lệ chúng thành [0,1] qua

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

Cảm ơn. Chức năng của mycolors là gì? Tôi không tìm thấy nó trong MATLAB hoặc FileExchange. Đó là mã của riêng bạn? – yuk