Có những thuật toán nào để chọn màu cho các đường vẽ trên đồ thị?


19

Tôi quan tâm đến những thuật toán hoặc quy tắc nào tôi có thể lập trình thực hiện để tạo màu RGB hoặc HSV cho các biểu đồ để giữ chúng khác biệt trực quan với các hàng xóm.

Tôi biết rằng trong lập bản đồ chuyên nghiệp, có các thuật toán hoặc quy tắc đảm bảo rằng không có hai quốc gia liền kề nào trên bản đồ có cùng màu. Tôi cũng có thể nghĩ về Microsoft office Excel như chọn các tông màu / sắc thái tốt cho các dòng cốt truyện (đỏ, rồi xanh, rồi tím / cam).

Đây là một ví dụ về những gì tôi đang nói - tôi cần tạo màu cho 12 dòng trên nền đen. Màu sắc ở đây tôi đã được mã hóa bằng tay bằng cách sử dụng mã màu RGB an toàn cho web. Vấn đề phát sinh khi các đường này trùng nhau - thật khó để biết liệu người ta đang nhìn vào màu tím, tím đậm hơn hay tím đậm. Tôi đang tìm kiếm một thuật toán tốt hơn để tạo ra màu sắc cho các cốt truyện như thế này.

Ví dụ màu nhiều dòng cốt truyện

Đây là một ví dụ sử dụng thư viện vẽ sơ đồ Flot cho jQuery, nó có sự kết hợp màu sắc đẹp cho biểu đồ: nhập mô tả hình ảnh ở đây


2
hai câu hỏi có liên quan ở đây: lập trình
viên.stackexchange.com/questions/44929 / Giả

Có vẻ như họ chỉ chọn màu cơ bản. Và bạn chỉ có năm dòng trong biểu đồ này trong khi ví dụ khác của bạn có mười hai. Nếu bạn để Flot có nhiều biểu đồ hơn, rất có thể bạn sẽ gặp phải các vấn đề tương tự. Chỉ có rất nhiều màu sắc khác nhau và từ đó bạn phải lặp lại các sắc thái và chỉ có thể cố gắng có một số "khoảng cách" giữa chúng.
thorsten müller

1
Mặc dù có một vấn đề rất thú vị (và tốt) ở đây, từ phía thực hiện thực tế, tôi sẽ đề nghị một cách rõ ràng việc xem xét việc xác định bộ màu cho một chủ đề (thang độ xám, độ tương phản cao, phấn màu, mù màu, v.v ...) số lượng tối đa hợp lý (trước khi nó trở nên không thể đọc được) - 32 hoặc 128 màu hoặc hơn (tùy thuộc vào ứng dụng) và sử dụng chỉ số mảng đó thay vì cố gắng tính toán màu tiếp theo.

Câu trả lời:


15

Tôi khuyên bạn nên sử dụng không gian màu HSV hoặc HSL, không phải không gian màu RGB, bởi vì HSV và HSL được cấu trúc tốt hơn để tạo ra màu sắc trông khác với con người. Bạn sẽ có nhiều công việc hơn trong RGB (mặc dù các chuyển đổi qua lại tồn tại, nếu bạn cần chúng).

Đây là những gì HSV / HSL trông giống như: nhập mô tả hình ảnh ở đây

Khi sử dụng không gian màu HSV hoặc HSL, bạn có thể giả sử (rất đại khái) rằng sự khác biệt giữa các thành phần H (màu sắc) của hai màu là một xấp xỉ tốt về khoảng cách cảm nhận giữa các màu - tức là sự thay đổi màu sắc càng lớn màu sắc khác nhau sẽ nhìn vào con người. Bạn có thể thử chơi với S (bão hòa) và L / V (độ sáng / giá trị) để phát ra một vài màu rất khác nhau, nhưng chúng sẽ không khác nhau khi thay đổi giá trị giống nhau khi thay đổi màu sắc.

Tùy thuộc vào số lượng màu sắc riêng biệt mà bạn cần, bạn có thể chia không gian màu thành số lượng màu khác nhau. Ví dụ: nếu bạn có dải màu gồm 256 giá trị và bạn yêu cầu 16 màu riêng biệt, thì màu đầu tiên của bạn có thể là (0, 128, 128), màu thứ hai của bạn (16, 128, 128), v.v. Tôi hơi tùy tiện chọn các giá trị S / L ở giữa vì đây thường sẽ là ánh sáng và đủ bão hòa để thấy rõ sự khác biệt về màu sắc. Hệ thống này rất đơn giản và giả sử bạn không cần biết gì về sự phụ thuộc của màu sắc trong biểu đồ / bản đồ của bạn.

Nếu bạn không biết trước mình cần bao nhiêu màu riêng biệt nhưng bạn biết giới hạn trên và chia phạm vi màu thành các màu với giới hạn trên đó như trên vẫn cho bạn màu sắc khác nhau về nhận thức thì bạn có thể sử dụng cùng một hệ thống với giới hạn trên.

Nếu bạn (có thể) cần rất nhiều màu sắc riêng biệt, bạn vẫn có thể thoát khỏi việc sử dụng các màu rất giống nhau hoặc thậm chí cùng màu, miễn là chúng không xuất hiện gần các yếu tố khác của biểu đồ có màu tương tự. Điều này đòi hỏi phải biết tình huống phụ thuộc của bạn trong biểu đồ bạn đang hiển thị và có thể không phải lúc nào cũng đơn giản, và thậm chí sau đó có thể không phải là ý tưởng hay khi Dukeling chỉ ra trong các nhận xét: có thể gây nhầm lẫn cho người xem rằng cùng màu được sử dụng hai lần trong biểu đồ cho hai khái niệm khác nhau.

Vì vậy, cuối cùng trong tình huống phức tạp nhất, biểu đồ của bạn đủ phức tạp để bạn không có đủ không gian màu để đảm bảo bạn không kết thúc với các yếu tố riêng biệt với màu sắc quá giống nhau khi sử dụng hệ thống trên. Trong trường hợp này, bạn cần xây dựng một biểu đồ kề của các yếu tố của biểu đồ trực quan hóa của bạn. Điều chỉnh ở đây là một khái niệm mờ - bạn sẽ phải xác định nó chính xác cho tình huống thực tế của bạn. Ví dụ, trong ví dụ thứ hai của bạn, dữ liệu vào ngày 12 tháng 7 có một điểm bị sặc trong đó mọi màu đều liền kề với nhau. Một cách tiếp cận có thể giúp bạn nếu bạn có thể xây dựng biểu đồ kề là vấn đề tô màu biểu đồ - có những thư viện có thể giúp bạn - ví dụ boost :: graph trong C ++ .


Bất kể có giao nhau hay không, bạn không muốn các màu giống nhau đại diện cho những thứ khác nhau trên một biểu đồ (nếu đây là những gì bạn ngụ ý), có quá nhiều chỗ để nhầm lẫn và bạn có thể không thể tìm ra đó là màu nào , vì vậy màu đồ thị là không liên quan. Trong trường hợp bạn không nhận thấy, mỗi dòng chỉ có một màu duy nhất và bao gồm một chuỗi các điểm được kết nối.
Dukeling

@Dukeling - bạn hiểu nhầm quan điểm của tôi. Tại một số điểm, cho dù bạn chọn cẩn thận đến mức nào, nếu bạn cần nhiều màu sắc khác nhau, bạn sẽ bắt đầu có các màu trông giống nhau (ví dụ: màu tím trong hình ảnh đầu tiên trong câu hỏi). Vào thời điểm đó, một triển khai đơn giản nhưng ngây thơ như tôi đề xuất có thể đặt các màu đó gần nhau, khiến cho việc xem những gì đang diễn ra trở nên khó khăn. Đó là khi bạn có thể sử dụng màu biểu đồ để đảm bảo rằng bạn đang sử dụng các màu ở xa cho các đường "đóng" trên biểu đồ.
Joris Timmermans

@Dukeling - Tôi đã chỉnh sửa câu trả lời của mình để đưa nhận xét của bạn về lý do tại sao việc sử dụng lại cùng màu có thể xấu.
Joris Timmermans

1

Đối với trường hợp bạn không biết trước có bao nhiêu màu riêng biệt, bạn sẽ cần một thuật toán thú vị khác là thuật toán tỷ lệ vàng .

Đơn giản chỉ cần bắt đầu với màu sắc yêu thích của bạn và sau đó đi xung quanh bánh xe màu theo các bước của góc vàng (137,5 °). Với góc này, bạn sẽ đảm bảo rằng sau mỗi lần tích chập xung quanh bánh xe màu, màu mới của bạn sẽ nằm giữa các màu bạn đã tạo.

Góc giữa các bông hoa liên tiếp ở một số hoa là góc vàng.

(Ảnh từ wikipedia )


0

Tôi đã thử nghiệm một chút và phát hiện ra rằng ngay cả với HSL / HSV, không dễ để có được một thuật toán hợp lý cho màu sắc đẹp, không bị xáo trộn, làm dịu (tất cả đều khá chủ quan, nhưng ...), nhưng màu sắc tương phản. Một số phần của bóng ma tương tự trực quan - đặc biệt. phần màu xanh-xanh. Vì vậy, tôi đã phải thêm một số biến thể nhẹ.

Đây là những gì tôi đã kết thúc với:

nhập mô tả hình ảnh ở đây

$.plot($('#application_pie'), data_application_pie, {
    series: { pie: { show: true,  innerRadius: 0.55, offset: { top: 0, left: -120 } } },
    colors: $.map( data_application_pie, function (item, index) {
        return jQuery.Color({
            hue: (index*0.95*360/data_application_pie.length),
            saturation: 0.95,
            //lightness: (index%2/-4)+0.55, alpha: 1
            lightness: ((index%4 == 3 ? 1:0)/-4)+0.55, alpha: 1
        }).toHexString();
    })
});
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.