Grafiklerde çizim çizgileri için renk seçmek için hangi algoritmalar var?


19

Grafiksel olarak komşularından görsel olarak farklı tutmak için plotline'lar için RGB veya HSV renkleri oluşturmak üzere programsal olarak uygulayabileceğim algoritmalar veya kurallarla ilgileniyorum .

Profesyonel harita yapımında, haritadaki iki bitişik ülkenin aynı renkte olmadığından emin olan algoritmalar veya kurallar olduğunu biliyorum. Ayrıca Microsoft office Excel'i çizim çizgileri için iyi renk tonları / gölgeler (kırmızı, sonra mavi, sonra mor / turuncu) seçmek olarak düşünebilirim.

İşte bahsettiğim şeyin bir örneği - Siyah bir arka plan üzerinde 12 çizgi için renk üretmem gerekiyor. Buradaki renkler web uyumlu RGB renk kodlarını kullanarak elle kodladım. Sorun, bu çizgiler üst üste geldiğinde ortaya çıkıyor - birinin mor, çok daha koyu mor veya menekşe bakıp bakmadığını söylemek zor. Böyle plotlines için renkler üretmek için daha iyi bir algoritma arıyorum.

Çoklu çizim çizgileri renk örneği

İşte jQuery için Flot çizim kütüphanesini kullanan bir örnek, grafikler için güzel bir renk dizisi var: resim açıklamasını buraya girin



Görünüşe göre sadece temel renkleri seçtiler. Ve bu grafikte sadece beş satır var, diğer örneğinizde on iki var. Flot'un daha fazla grafiğe sahip olmasına izin verirseniz, büyük olasılıkla benzer sorunlarla karşılaşırsınız. Sadece o kadar çok farklı renk var ve oradan tonları tekrarlamanız gerekiyor ve aralarında sadece bir miktar mesafe bırakmayı deneyebilirsiniz.
thorsten müller

1
Burada çok ilginç (ve iyi) bir sorun olsa da, pratik bir uygulama tarafından, bir tema için (gri tonlama, yüksek kontrast, pastel, renk körlüğü, vb.) makul maksimum sayı (okunamaz hale gelmeden önce) - 32 veya 128 veya daha fazla renk (uygulamaya bağlı olarak) ve bir sonraki rengi hesaplamak yerine bu dizi dizinini kullanın.

Yanıtlar:


15

HSV veya HSL renk uzaylarını değil, RGB renk uzayını kullanmanızı öneririm, çünkü HSV ve HSL insanlar için farklı görünen renkler üretmek için daha iyi yapılandırılmıştır. RGB'de daha fazla çalışmanız olacak (ileri geri dönüşümler olsa da, ihtiyacınız olursa).

HSV / HSL şöyle görünür: resim açıklamasını buraya girin

HSV veya HSL renk uzayını kullanırken, iki rengin H (ton) bileşenleri arasındaki farkın renkler arasındaki algısal mesafenin iyi bir tahmini olduğunu varsayabilirsiniz (yani, tondaki değişiklik ne kadar büyük olursa, daha fazla farklı renkler insanlara bakacak. Birkaç farklı renk daha eklemek için S (doygunluk) ve L / V (açıklık / değer) ile oynamayı deneyebilirsiniz, ancak tonu değiştirmekle aynı değer değişikliği için farklı görünmeyecektir.

İhtiyacınız olan farklı renklerin sayısına bağlı olarak, ton alanını o sayıda farklı renge bölebilirsiniz. Örneğin, 256 değerlik bir renk aralığınız varsa ve 16 farklı renge ihtiyacınız varsa, ilk renginiz (0, 128, 128), ikinciniz (16, 128, 128) vb. Biraz keyfi olarak S / L değerlerini ortada şapırtı aldım, çünkü bu genellikle hafif ve renk farklılıklarını açıkça görebilecek kadar doygun olacak. Bu sistem basittir ve grafiğinizdeki / haritanızdaki renklerin bitişiğiyle ilgili hiçbir şey bilmemeniz gerektiğini varsayar.

Kaç farklı renge ihtiyacınız olduğunu önceden bilmiyorsanız ancak üst limiti biliyorsanız ve ton aralığını yukarıdaki gibi göz önünde bulundurarak renklere bölmek size hala algısal olarak farklı renkler kazandırırsa, aynı sistemi kullanabilirsiniz. üst sınır.

Çok fazla farklı renge ihtiyacınız varsa (eğer), grafiğin benzer renge sahip diğer öğelerinin yakınında görünmedikleri sürece, çok benzer veya hatta aynı renkleri kullanmaktan kurtulabilirsiniz. Bu, oluşturduğunuz grafikteki bitişik durumunuzu bilmenizi gerektirir ve her zaman basit olmayabilir ve o zaman bile Dukeling'in yorumlarda belirttiği gibi iyi bir fikir olmayabilir: İzleyicilere aynı rengin kullanıldığı kafa karıştırıcı olabilir iki farklı kavram için grafikte iki kez.

Son olarak, en karmaşık durumda grafiğiniz, yukarıdaki sistemi kullanarak çok benzer renklere sahip farklı öğelerle sonuçlanmamanızı sağlayacak kadar renk alanınız olmayacak kadar karmaşıktır. Bu durumda, görselleştirme grafiğinizin öğelerinin bir bitişik grafiğini oluşturmanız gerekir. Buradaki bitişiklik bulanık bir kavramdır - gerçek durumunuz için doğru bir şekilde tanımlamanız gerekecektir. Örneğin ikinci örneğinizde, 12 Temmuz'daki veriler, her rengin birbirine bitişik olduğu bir boğulma noktasına sahiptir. Bitişiklik grafiğini oluşturabilirseniz size yardımcı olabilecek bir yaklaşım, grafik renklendirme sorunudur - size yardımcı olabilecek kütüphaneler vardır - örneğin , C ++ 'da boost :: graph .


Ne olursa olsun olmasın orada kavşak, sen yok (bu ima buysa), karışıklık için çok fazla yer var aynı renkleri tek bir grafikte farklı şeyler temsil istiyorum ve hangi anlamaya mümkün olmayabilir hangi , bu nedenle grafik renklendirme ilgisizdir. Farketmemeniz durumunda, her çizginin yalnızca tek bir rengi vardır ve bir dizi bağlantılı noktadan oluşur.
Dukeling

@Dukeling - fikrimi yanlış anlıyorsun. Bir noktada, ne kadar dikkatli seçerseniz seçin, birçok farklı renge ihtiyacınız varsa, benzer görünen renklere sahip olmaya başlayacaksınız (örneğin, sorunun ilk resmindeki morlar). Bu noktada, önerdiğim gibi saf ama basit bir uygulama, bu renkleri birbirine yakınlaştırarak neler olup bittiğini görmeyi zorlaştırabilir. İşte o zaman grafikteki "yakın" çizgiler için uzak renkler kullandığınızdan emin olmak için grafik renklendirmeyi kullanabilirsiniz.
Joris Timmermans

@Dukeling - Cevabımı, aynı rengin tekrar kullanılmasının neden kötü olabileceğine dair görüşünüzü içerecek şekilde düzenledim.
Joris Timmermans

1

Kaç tane farklı renge ihtiyacınız olacağını bilmediğiniz durumda, başka bir ilginç algoritma altın oran algoritmasıdır .

En sevdiğiniz renkten başlayın ve ardından altın açının (137.5 °) adımlarında renk tekerleğini dolaşın. Bu açı ile renk tekerleği etrafındaki her kıvrımdan sonra yeni renklerin daha önce oluşturduğunuz renkler arasında kalmasını sağlarsınız.

Bazı çiçeklerde birbirini izleyen çiçekler arasındaki açı altın açıdır.

( Vikipedi'den resim )


0

Biraz denedim ve HSL / HSV ile bile güzel, rahatsız edici, sakinleştirici (hepsi oldukça öznel, ancak ...), ancak kontrastlı renkler için iyi bir algoritma elde etmenin pek kolay olmadığını öğrendim. Hayaletlerin bazı bölümleri görsel olarak benzer - esp. yeşil-mavi bölüm. Bu yüzden hafiflik varyasyonu eklemek zorunda kaldım.

İşte sonuçta:

resim açıklamasını buraya girin

$.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();
    })
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.