Làm thế nào để tìm một sự liên kết phù hợp của màu sắc với giá trị dữ liệu trong một trực quan?


8

Tôi đang làm việc trên một dự án phần mềm liên quan đến việc tạo một trình hiển thị cho mô phỏng lũ. Là một phần của dự án này, tôi đã tạo ra một dải nước cho thấy độ sâu của nước tại các điểm cụ thể. Để đặt giá trị nào sẽ đại diện cho màu nào, tôi đi qua dữ liệu và nhận các giá trị tối thiểu và tối đa xảy ra và phân bổ đều các màu theo tỷ lệ đó.

Tuy nhiên, thường có những điểm trong các mô phỏng này có nước sâu hơn đáng kể so với bất kỳ nơi nào khác trong mô phỏng. Điều này khiến hầu hết các điểm trên bản đồ có màu rất giống nhau và điều này không có nhiều thông tin và làm cho các khu vực nơi nước sâu hơn rất khó nhìn thấy.

Mục tiêu của tôi là dành một dải màu lớn hơn cho độ sâu xảy ra thường xuyên hơn. Ví dụ: nếu độ sâu đi từ 0 đến 12 nhưng hầu hết độ sâu nằm trong khoảng từ 1 đến 2, tôi muốn có nhiều biến đổi màu xảy ra trong phạm vi đó hơn là từ 11 đến 12 hoặc 4 và 5. Có vẻ như tôi cần sử dụng độ lệch chuẩn hoặc một cái gì đó liên quan đến phân phối bình thường để làm điều này, nhưng tôi hơi mơ hồ về cách những thứ này hoạt động và làm thế nào tôi có thể sử dụng chúng để thực hiện mục tiêu của mình.

Bất kỳ trợ giúp có thể được cung cấp sẽ được đánh giá cao. Cảm ơn bạn.


Không tích cực Tôi hiểu chính xác nhưng có lẽ nếu bạn thay vào đó sử dụng logarit của thang đo hiện tại của bạn thì nó sẽ trông tốt hơn. Bạn có một hình ảnh bạn có thể hiển thị?
jerad

Câu trả lời:


9

Có vẻ như bạn có thể muốn dành từng màu trong bảng màu của mình cho cùng một lượng dữ liệu.

110

Biểu đồ

10

Mật độ hạt nhân, thái lát

Một cách để thực hiện việc cắt lát dễ dàng là vẽ tổng số lượng dữ liệu ("tỷ lệ tích lũy") theo độ sâu. Cắt trục dọc thành các khoảng chẵn, sau đó đọc độ sâu nơi các lát cắt ngang qua ô: sử dụng chúng làm điểm cắt để hiển thị độ sâu.

CDF

Thuật toán tính toán các điểm cắt từ dữ liệu nên rõ ràng và đơn giản để viết bằng hầu hết mọi ngôn ngữ lập trình: sắp xếp các giá trị, chia danh sách thành các nhóm có kích thước xấp xỉ bằng nhau và chọn các điểm cắt để tách giá trị lớn nhất trong mỗi nhóm khỏi giá trị nhỏ nhất trong nhóm thành công nó.


2
Xuất sắc. Đây chính xác là những gì tôi muốn và nó đơn giản hơn nhiều so với tôi dự đoán. Cảm ơn bạn rất nhiều vì đã làm rõ vấn đề của tôi và cung cấp một giải pháp thanh lịch.
SethGunnells

10

Mặc dù câu trả lời của @ whuber chỉ cung cấp những gì bạn đã hỏi, tôi muốn cảnh báo rằng những gì bạn hỏi có thể không phải là cách tốt nhất để thể hiện trực quan dữ liệu của bạn, vì hai lý do.

  1. Người xem sẽ tự nhiên cho rằng màu sắc được phân bổ đều theo giá trị (độ sâu) chứ không phải theo thứ hạng. Bạn sẽ phải làm việc chăm chỉ với việc dán nhãn của mình để khiến bộ não nhận thức của người xem ghi đè lên những gì hệ thống thị giác của họ đang nói với họ.
  2. Thứ hạng có thể không quan trọng đối với người xem của bạn hơn độ sâu thực tế. Nếu có nhiều giá trị trong khoảng từ 0 đến 1, thì có vấn đề gì về mặt phân tích làm thế nào các giá trị đó được phân phối không?

Tất nhiên, bạn biết ứng dụng của mình tốt nhất, vì vậy tôi không thể nói câu trả lời đúng là gì, nhưng dưới đây là một số lựa chọn thay thế sử dụng dữ liệu được tạo bởi

r = Sqrt((:x * :x + :y * :y) / 400);
t = ArcTan(:y, :x);
z = (12 * Exp(-r * r * 3)) * Abs(Sin(2 * Pi() * r) - r * Cos(3 * t))

Dữ liệu đi từ 0 đến 12,5 với phân phối sau:

biểu đồ

Biểu đồ bề mặt 3 chiều cho thấy một số đỉnh, máng nông và gò nhỏ:

lô bề mặt

Bây giờ hãy xem xét một số lô đường viền 2 chiều.

Ánh xạ màu tuyến tính thẳng, bỏ lỡ các tính năng nhỏ hơn như bạn đã thấy:

ánh xạ màu tuyến tính

Nếu sự thay đổi trong các khu vực sâu là không quan trọng, thì việc cắt ánh xạ màu cho phép nhiều màu sắc hơn cho các độ sâu nhỏ hơn trong khi duy trì ánh xạ tuyến tính trong khu vực đó:

cắt ánh xạ màu tuyến tính

Để so sánh, đây là chế độ xem màu xếp hạng (xin lỗi rằng huyền thoại của tôi nằm trong các giá trị xếp hạng thay vì giá trị độ sâu):

ánh xạ màu xếp hạng

Tôi không chắc đó có phải là đại diện tốt cho ứng dụng của bạn hay không. Các chi tiết trong máng nông được phóng đại. Ánh xạ màu nhật ký tương tự và có ưu điểm là có một số giải thích thực sự và có thể thống nhất giữa các tập dữ liệu, nhưng nhật ký vẫn không nhận thức được (xin lỗi lần nữa cho huyền thoại):

ánh xạ màu

Cuối cùng, đây là một cách tiếp cận theo một hướng hơi khác có thể được kết hợp với bất kỳ cách nào ở trên để tăng độ phân giải: ánh xạ màu đa sắc. Trong trường hợp này, tô màu là tuyến tính và cắt bớt:

cắt tuyến tính kép

Cuối cùng, một cách tiếp cận mà phần mềm của tôi không cho phép là sử dụng ánh xạ màu tuyến tính nhiều mảnh, mà tôi đã thấy trong một số bản đồ độ cao. Chẳng hạn, độ cao thấp là màu xanh lục với bước tăng 50 ft, độ cao giữa là độ nghiêng theo bước tăng 200 ft và độ cao là độ xám với bước tăng 800 ft.

Điểm mấu chốt : sẽ tốt hơn nếu bộ não của người xem hoạt động với hệ thống nhận thức trực quan của bạn thay vì chống lại nó.


1
Cảm ơn vi đa trả lơi. Tôi đã thực hiện câu trả lời của các nhà sản xuất và thấy rằng, như bạn đã đề cập và như tôi dự đoán, nó đã tạo ra một hình ảnh rất lừa đảo và không trực quan về độ sâu thực tế. Tôi nghĩ rằng giải pháp tôi đã giải quyết là tạo ra sự tương phản rõ nét hơn giữa màu "nông" và màu "sâu" để tôi có thể duy trì độ dốc đồng đều và trực quan trong khi vẫn giúp người dùng dễ dàng nhìn thấy các khu vực có vấn đề hơn.
SethGunnells

2
Blues là một lựa chọn đặc biệt tốt trong nhiều trường hợp bởi vì hệ thống thị giác của con người nhạy cảm hơn nhiều với các biến thể của màu sắc trong khu vực đó.
Đức Hồng Y

2
@cardinal: Miễn là người quan sát của bạn trẻ hơn. Có sự mất độ nhạy bước sóng ngắn theo tuổi (ví dụ: ncbi.nlm.nih.gov/pubmed/3230483 ).
russellpierce
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.