Tự động vẽ các đường màu khác nhau


112

Tôi đang cố gắng vẽ một số ước tính mật độ hạt nhân trên cùng một biểu đồ và tôi muốn chúng có màu khác nhau. Tôi có một giải pháp kludged bằng cách sử dụng một chuỗi 'rgbcmyk'và bước qua nó cho từng ô riêng biệt, nhưng tôi bắt đầu có các bản sao sau 7 lần lặp. Có cách nào dễ dàng hơn / hiệu quả hơn để làm điều này và với nhiều tùy chọn màu sắc hơn không?

for n=1:10
 source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
 [f,x]=ksdensity(source(n).data); % calculate the distribution
 plot(x,f,cstring(mod(n,7)+1))  % plot with a different color each time
end

30
Bạn đã thử đơn giản làm "giữ tất cả"? Điều đó tự động vẽ màu tin tức cho mỗi lệnh cốt truyện mới.
twerdster

3
"Giữ tất cả" không phải là một câu trả lời cho câu hỏi thực tế, nhưng có thể là một giải pháp cho nhiều người kết thúc ở đây bởi vì chỉ một "giữ" vẽ tất cả các đường cong màu xanh lam. Rất cám ơn @twerdster!
Rémi

8
Tính đến R2014b , thông thường hold onchức năng tương đương để hold all. Tuy nhiên, câu hỏi làm thế nào để có được nhiều hơn 7 màu mặc định vẫn còn. Bản đồ màu mặc định có thể là một giải pháp như được Azim mô tả hoặc có thể sử dụng một chức năng để tạo ra các màu được điều chỉnh để dễ dàng phân biệt trực quan, như bên dưới .
chappjc

1
Khi tôi sử dụng, hold alltôi nhận được các ô có màu sắc khác nhau (mặc dù tôi phải nói rằng chúng trông khá buồn tẻ), trong khi khi tôi sử dụng hold on, tất cả các ô của tôi trở thành màu xanh lam. Vì vậy, tôi tự hỏi tương đương chức năng là gì.
HelloGoodbye,

4
@HelloGoodbye Trong R2014b và mới hơn, hold oncung cấp các ô màu khác nhau. Bạn đang sử dụng và phiên bản cũ hơn. Từ tài liệu hiện tại , " hold allgiống như hold on. Lưu ý: Cú pháp này sẽ bị xóa trong bản phát hành trong tương lai. Hãy sử dụng hold onthay thế". Xem thêm ghi chú phát hành .
chappjc

Câu trả lời:


131

Bạn có thể sử dụng một bản đồ màu như HSV để tạo ra một tập hợp các màu. Ví dụ:

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end

MATLAB có 13 bản đồ màu được đặt tên khác nhau ( 'Bản đồ màu doc' liệt kê tất cả chúng).

Một tùy chọn khác để vẽ các đường bằng các màu khác nhau là sử dụng thuộc tính LineStyleOrder ; xem Xác định Màu của Đường để Vẽ trong tài liệu MATLAB để biết thêm thông tin.


Đang tìm kiếm nó. An lành @Azim.
giáo sư

Vì lợi ích của hậu thế, tôi đã chọn chấp nhận câu trả lời này thay hold allvì giải pháp của @Mark Elliot do tính linh hoạt của nó khi có thể chọn các bản đồ màu khác nhau.
Doresoom

Làm thế nào tôi có thể làm cho nó hoạt động bằng cách sử dụng lệnh âm mưu "dòng" thay vì âm mưu?
Pedro77,

106

Trên thực tế, một phương pháp tắt phù hợp để chuyển màu theo chu kỳ là sử dụng hold all;thay thế hold on;. Mỗi liên tiếp plotsẽ xoay vòng (tự động cho bạn) thông qua bản đồ màu mặc định của MATLAB.

Từ trang MATLAB trên hold:

hold allgiữ biểu đồ và màu đường hiện tại và kiểu đường để các lệnh vẽ biểu đồ tiếp theo không đặt lại giá trị thuộc tính ColorOrder và LineStyleOrder về đầu danh sách. Các lệnh vẽ đồ thị tiếp tục đi qua các màu và kiểu đường được xác định trước từ vị trí cuối cùng của đồ thị dừng lại trong danh sách.


36

Câu trả lời muộn, nhưng cần thêm hai điều:

  • Để biết thông tin về cách thay đổi thuộc 'ColorOrder'tính và cách đặt mặc định chung với 'DefaultAxesColorOrder', hãy xem "Phụ lục" ở cuối bài đăng này.
  • Có một công cụ tuyệt vời trên MATLAB Central File Exchange để tạo ra bất kỳ số lượng màu sắc riêng biệt trực quan nào, nếu bạn có Hộp công cụ xử lý hình ảnh để sử dụng nó. Đọc tiếp để biết chi tiết.

Các ColorOrder axesbất động sản cho phép MATLAB để tự động chu kỳ thông qua một danh sách các màu sắc khi sử dụng hold on/all(một lần nữa, xem phụ lục dưới đây để biết cách set/ getsự ColorOrdercho một trục cụ thể hoặc trên toàn cầu thông qua DefaultAxesColorOrder). Tuy nhiên, theo mặc định MATLAB chỉ chỉ định một danh sách ngắn các màu ( chỉ có 7 màu kể từ R2013b) để chuyển qua và mặt khác, có thể gặp vấn đề khi tìm một bộ màu tốt cho nhiều chuỗi dữ liệu hơn. Đối với 10 ô, bạn rõ ràng không thể dựa vào mặc định ColorOrder.

Một cách tuyệt vời để xác định N màu khác biệt về mặt trực quan là gửi "Tạo màu phân biệt tối đa theo cảm nhận" (GMPDC) trên MATLAB Central File Exchange . Nó được mô tả tốt nhất bằng lời của chính tác giả:

Chức năng này tạo ra một tập hợp màu có thể phân biệt được bằng cách tham chiếu đến không gian màu "Phòng thí nghiệm" , phù hợp chặt chẽ với nhận thức màu của con người hơn là RGB. Với một danh sách lớn ban đầu có thể có các màu, nó sẽ chọn mục nhập trong danh sách xa nhất (trong không gian Phòng thí nghiệm) từ tất cả các mục nhập đã chọn trước đó.

Ví dụ: khi 25 màu được yêu cầu:

25 "màu sắc khác biệt về mặt cảm nhận một cách tối đa"

Bài gửi GMPDC đã được chọn trên blog chính thức của MathWorks là Lựa chọn của Tuần vào năm 2010 một phần vì khả năng yêu cầu số lượng màu tùy ý (trái ngược với MATLAB được xây dựng trong 7 màu mặc định). Họ thậm chí còn đưa ra đề xuất tuyệt vời để đặt MATLAB ColorOrderkhi khởi động thành,

distinguishable_colors(20)

Tất nhiên, bạn có thể đặt ColorOrdercho một trục duy nhất hoặc chỉ cần tạo một danh sách các màu để sử dụng theo bất kỳ cách nào bạn muốn. Ví dụ: để tạo 10 "màu sắc khác biệt theo nhận thức tối đa" và sử dụng chúng cho 10 ô trên cùng một trục ( nhưng không sử dụng ColorOrder, do đó yêu cầu một vòng lặp ):

% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
    plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end

Quá trình này được đơn giản hóa, không yêu cầu forvòng lặp, với thuộc tính ColorOrdertrục :

% X có kích thước N-by-P-by-2
mpdc10 = phân biệt_màu (10)
ha = trục; giữ (ha, 'trên')
set (ha, 'ColorOrder', mpdc10)% --- đặt ColorOrder TẠI ĐÂY ---
plot (X (:,:, 1), X (:,:, 2), '-.')% KHÔNG cần vòng lặp, KHÔNG cần 'màu'. Yay!

RUỘT THỪA

Để lấy ColorOrdermảng RGB được sử dụng cho trục hiện tại,

get(gca,'ColorOrder')

Để lấy mặc định ColorOrdercho các trục mới,

get(0,'DefaultAxesColorOrder')

Ví dụ về thiết lập toàn cục mới ColorOrdervới 10 màu trên MATLAB start, trong startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))

2
Chỉ cần lưu ý, điều này dường như yêu cầu Hộp công cụ xử lý hình ảnh.
Doresoom

2
@Doresoom Cảm ơn vì thông tin. Tôi đã cập nhật bài viết.
chappjc

12

Đến muộn bữa tiệc. Tôi đã tự mình xem xét vấn đề này và chỉ tìm thấy về tùy chọn trục này có tên là ColorOrder, bạn có thể chỉ định thứ tự màu cho phiên hoặc chỉ cho hình và sau đó chỉ cần vẽ một mảng và để MATLAB tự động chuyển qua các màu được chỉ định.

xem Thay đổi Thứ tự Màu Mặc định

thí dụ

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

1
Đối với trục một lần:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev

1
tuyệt vời chỉ để thông báo về máy bay phản lực (số) không yêu cầu bất kỳ hộp công cụ ưa thích nào
crobar

4

Nếu tất cả các vectơ có kích thước bằng nhau, hãy tạo một ma trận và vẽ đồ thị. Mỗi cột được vẽ với một màu khác nhau tự động Sau đó, bạn có thể sử dụng legendđể chỉ ra các cột:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

Hoặc, nếu bạn có một ô có tên hạt nhân, hãy sử dụng

legend(names)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.