Bagaimana menemukan hubungan warna yang sesuai dengan nilai data dalam visualisasi?

8

Saya sedang mengerjakan proyek perangkat lunak yang melibatkan pembuatan visualizer untuk simulasi banjir. Sebagai bagian dari proyek ini, saya telah membuat gradien air yang menunjukkan kedalaman air pada titik-titik tertentu. Untuk mengatur nilai apa yang akan mewakili warna apa, saya mencari data dan mendapatkan nilai minimum dan maksimum yang terjadi dan mendistribusikan warna secara merata sesuai skala itu.

Namun, sering kali poin dalam simulasi ini memiliki air yang lebih dalam secara signifikan daripada di tempat lain dalam simulasi. Hal ini menyebabkan sebagian besar titik di peta memiliki warna yang sangat mirip dan ini tidak terlalu informatif dan membuat area di mana airnya lebih dalam sangat sulit untuk dilihat.

Tujuan saya adalah mendedikasikan rentang warna yang lebih besar untuk kedalaman yang lebih sering terjadi. Misalnya, jika kedalaman berubah dari 0 ke 12 tetapi sebagian besar kedalaman antara 1 dan 2, saya ingin lebih banyak variasi warna terjadi dalam rentang itu daripada antara katakan 11 dan 12 atau 4 dan 5. Sepertinya saya perlu menggunakan deviasi standar atau sesuatu yang melibatkan distribusi normal untuk melakukan ini, tetapi saya agak bingung tentang bagaimana hal-hal ini bekerja dan bagaimana saya dapat menggunakannya untuk mencapai tujuan saya.

Bantuan apa pun yang dapat diberikan akan dihargai. Terima kasih.

SethGunnells
sumber
Tidak positif saya mengerti dengan benar, tetapi mungkin jika Anda menggunakan logaritma skala Anda saat ini akan terlihat lebih baik. Apakah Anda memiliki gambar yang bisa Anda perlihatkan?
jerad

Jawaban:

9

Sepertinya Anda mungkin ingin mendedikasikan setiap warna di palet Anda dengan jumlah data yang kira-kira sama.

Untuk mengilustrasikan, berikut adalah histogram dari satu set 110 bacaan kedalaman simulasi:

Histogram

Bayangkan ini dihaluskan. Dengan melakukan hal itu, histogram dapat diiris secara merata menjadi segmen vertikal dengan luas yang sama, menggunakan sebanyak mungkin irisan yang Anda suka (saya menggunakan10 potongan untuk contoh ini.) Untuk menjaga daerah yang sama, irisan harus kurus di mana histogram tinggi - yaitu, di mana ada banyak data - dan lemak di mana histogram rendah - yaitu, di mana ada sedikit data.

Kepadatan kernel, diiris

Salah satu cara untuk menyelesaikan pemotongan dengan mudah adalah memplot jumlah total data ("proporsi kumulatif") terhadap kedalaman. Iris sumbu vertikal menjadi interval genap, kemudian baca kedalaman di mana irisan melintasi plot: gunakan itu sebagai titik potong untuk memvisualisasikan kedalaman.

CDF

Algoritma untuk menghitung cutpoint dari data harus jelas dan mudah ditulis di hampir semua bahasa pemrograman: mengurutkan nilai, memecah daftar menjadi kelompok dengan ukuran yang hampir sama, dan memilih cutpoint untuk memisahkan nilai terbesar di setiap grup dari nilai terkecil dalam kelompok yang berhasil itu.

whuber
sumber
2
Cemerlang. Ini persis apa yang saya inginkan dan itu jauh lebih sederhana daripada yang saya perkirakan. Terima kasih banyak untuk kedua-duanya memperjelas masalah saya dan memberikan solusi yang elegan.
SethGunnells
10

Meskipun jawaban @ whuber hanya memberikan apa yang Anda minta, saya ingin mengingatkan bahwa apa yang Anda minta mungkin bukan cara terbaik untuk secara visual mewakili data Anda, karena dua alasan.

  1. Pemirsa secara alami akan berasumsi bahwa warna didistribusikan secara merata berdasarkan nilai (kedalaman) daripada peringkat. Anda harus bekerja keras dengan label Anda untuk mendapatkan otak kognitif pemirsa untuk menolak apa yang dikatakan sistem visual mereka.
  2. Peringkat mungkin tidak lebih penting bagi pemirsa Anda daripada kedalaman sebenarnya. Jika ada banyak nilai antara 0 dan 1, katakanlah, apakah penting secara analitik bagaimana nilai-nilai itu didistribusikan?

Anda tahu aplikasi Anda yang terbaik, tentu saja, jadi saya tidak bisa mengatakan apa jawaban yang benar, tetapi di bawah ini adalah beberapa alternatif menggunakan data yang dihasilkan oleh

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

Data berubah dari 0 menjadi 12,5 dengan distribusi berikut:

histogram

Plot permukaan 3-D menunjukkan beberapa puncak, palung dangkal, dan gundukan kecil:

plot permukaan

Sekarang mari kita lihat beberapa plot kontur 2-D.

Pemetaan warna linier lurus, yang melewatkan fitur yang lebih kecil seperti yang Anda perhatikan:

pemetaan warna linier

Jika variasi di area yang dalam tidak penting, maka memotong pemetaan warna memungkinkan lebih banyak warna untuk kedalaman yang lebih kecil sambil mempertahankan pemetaan linier di area itu:

pemetaan warna linier terpotong

Sebagai perbandingan, inilah tampilan berwarna pangkat (maaf legenda saya adalah nilai pangkat, bukan nilai kedalaman):

pemetaan warna peringkat

Saya tidak yakin apakah itu representasi yang bagus untuk aplikasi Anda atau tidak. Detail dalam palung dangkal dilebih-lebihkan. Pemetaan warna log serupa dan memiliki keuntungan memiliki beberapa interpretasi nyata dan dapat konsisten di seluruh set data, tetapi log masih belum perseptual (permintaan maaf lagi untuk legenda):

pemetaan warna log

Akhirnya, inilah pendekatan dalam arah yang sedikit berbeda yang dapat dikombinasikan dengan salah satu di atas untuk meningkatkan resolusi: pemetaan warna multi-warna. Dalam hal ini, pewarnaannya linear dan terpotong:

linear terpotong ganda

Pasca-akhirnya, suatu pendekatan yang tidak mudah diizinkan oleh perangkat lunak saya adalah dengan menggunakan pemetaan warna linear multi-warna, yang telah saya lihat di beberapa peta ketinggian. Sebagai contoh, ketinggian rendah adalah hijau dengan peningkatan 50 kaki, ketinggian tengah adalah tan dengan penambahan 200 kaki dan tertinggi adalah abu-abu dengan kenaikan 800 kaki.

Intinya : lebih baik jika otak pemirsa bekerja dengan sistem persepsi visual Anda daripada menentangnya.

xan
sumber
1
Terima kasih balasannya. Saya menerapkan jawaban whuber dan menemukan bahwa, seperti yang Anda sebutkan dan seperti yang saya harapkan, itu menghasilkan grafik yang sangat menipu dan tidak terlalu intuitif dalam hal kedalaman sebenarnya. Saya pikir solusi yang telah saya tentukan adalah membuat kontras yang lebih tajam antara warna "dangkal" dan warna "dalam" sehingga saya dapat mempertahankan gradien yang genap dan intuitif sambil tetap membuatnya lebih mudah bagi pengguna untuk melihat area masalah potensial.
SethGunnells
2
Blues adalah pilihan yang sangat baik dalam banyak kasus karena sistem visual manusia jauh lebih sensitif terhadap variasi rona di wilayah itu.
kardinal
2
@ cardinal: Selama pengamat Anda lebih muda. Ada hilangnya sensitivitas panjang gelombang pendek dengan usia (misalnya ncbi.nlm.nih.gov/pubmed/3230483 ).
russellpierce