Quais algoritmos existem para escolher cores para linhas de plotagem em gráficos?

19

Estou interessado em quais algoritmos ou regras posso implementar programaticamente para gerar cores RGB ou HSV para linhas de plotagem para mantê-las visualmente distintas das vizinhas.

Sei que na criação profissional de mapas existem algoritmos ou regras que garantem que não haja dois países adjacentes em um mapa da mesma cor. Também posso pensar no Microsoft office Excel como escolher boas tonalidades / tons para linhas de plotagem (vermelho, azul e roxo / laranja).

Aqui está um exemplo do que estou falando - preciso gerar cores para 12 linhas em um fundo preto. As cores aqui foram codificadas manualmente usando códigos de cores RGB seguros para a Web. O problema surge quando essas linhas se sobrepõem - é difícil dizer se alguém está olhando para roxo, roxo ou violeta ligeiramente mais escuro. Estou procurando um algoritmo melhor para produzir cores para tramas como essas.

Exemplo de várias linhas de plotagem

Aqui está um exemplo usando a biblioteca de plotagem Flot para jQuery, que possui uma boa sucessão de cores para gráficos: insira a descrição da imagem aqui

Alex Stone
fonte
Parece que eles apenas escolheram as cores base. E você tem apenas cinco linhas neste gráfico enquanto seu outro exemplo tem doze. Se você deixasse o Flot ter mais gráficos, provavelmente teria problemas semelhantes. Existem apenas muitas cores diferentes e, a partir daí, é necessário repetir os tons e tentar apenas ter alguma "distância" entre eles.
thorsten müller
1
Embora exista um problema muito interessante (e bom) aqui, do lado prático da implementação, eu sugeriria estritamente procurar identificar a cor definida para um tema (escala de cinza, alto contraste, tons pastel, daltônico, etc ...) com um número máximo razoável (antes que se torne ilegível) - 32 ou 128 cores (dependendo do aplicativo) e use esse índice de matriz em vez de tentar calcular a próxima cor.

Respostas:

15

Eu recomendo usar os espaços de cores HSV ou HSL, não o espaço de cores RGB, porque o HSV e o HSL são melhor estruturados para gerar cores que parecem diferentes para os seres humanos. Você terá mais trabalho em RGB (embora existam conversões para frente e para trás, caso precise delas).

É assim que o HSV / HSL se parece: insira a descrição da imagem aqui

Ao usar o espaço de cores HSV ou HSL, você pode assumir (mais ou menos) que a diferença entre os componentes H (matiz) de duas cores é uma boa aproximação da distância perceptiva entre as cores - ou seja, quanto maior a mudança de matiz, mais diferentes as cores vão olhar para os seres humanos. Você pode tentar tocar com S (saturação) e L / V (luminosidade / valor) e também obter mais algumas cores muito diferentes, mas elas não parecerão tão diferentes para a mesma alteração de valor quanto para variar a tonalidade.

Dependendo do número de cores distintas necessárias, é possível dividir o espaço da tonalidade nesse número de cores diferentes. Se, por exemplo, você tiver um intervalo de matiz de 256 valores e precisar de 16 cores distintas, sua primeira cor poderá ser (0, 128, 128), sua segunda (16, 128, 128) e assim por diante. De certa forma, escolhi arbitrariamente os valores S / L bem no meio aqui, pois geralmente serão leves e saturados o suficiente para ver claramente as diferenças de cores. Este sistema é simples e assume que você não precisa saber nada sobre adjacência de cores em seu gráfico / mapa.

Se você não conhece antecipadamente quantas cores distintas precisa, mas conhece o limite superior, e dividir o intervalo de matizes em cores com esse limite superior em mente, como acima, ainda fornece boas cores perceptivamente diferentes, então você pode usar o mesmo sistema com o limite superior.

Se você precisar de muitas cores distintas, ainda poderá usar cores muito semelhantes ou até as mesmas, desde que elas não apareçam perto dos outros elementos do gráfico que possuem a mesma cor. Isso exige que você conheça sua situação de adjacência no gráfico que você está processando e nem sempre seja direto, e mesmo assim pode não ser uma boa ideia, como Dukeling aponta nos comentários: pode ser confuso para os espectadores que a mesma cor seja usada duas vezes no gráfico para dois conceitos diferentes.

Portanto, finalmente, na situação mais complexa, seu gráfico é complexo o suficiente para que você não tenha espaço de cores suficiente para garantir que você não termine com elementos distintos com cores muito semelhantes no sistema acima. Nesse caso, você precisa criar um gráfico de adjacência de elementos do seu gráfico de visualização. A adjacência aqui é um conceito confuso - você terá que defini-lo corretamente para sua situação real. Por exemplo, no seu segundo exemplo, os dados de 12 de julho têm um ponto de estrangulamento em que todas as cores são adjacentes a todas as outras. Uma abordagem que pode ajudá-lo se você pode criar o gráfico de adjacência é o problema de coloração do gráfico - existem bibliotecas que podem ajudá-lo - por exemplo, boost :: graph em C ++ .

Joris Timmermans
fonte
Independentemente de haver ou não interseção, você não deseja as mesmas cores que representam coisas diferentes em um único gráfico (se é isso que você sugere), há muito espaço para confusão e você pode não conseguir descobrir qual é qual , portanto, a coloração do gráfico não está relacionada. Caso você não tenha notado, cada linha tem apenas uma cor e consiste em uma sequência de pontos conectados.
Dukeling 14/05
@ Dukeling - você entendeu mal o meu ponto. Em algum momento, não importa quão cuidadosamente você escolha, se precisar de muitas cores diferentes, você começará a ter cores parecidas (por exemplo, os roxos na primeira imagem da pergunta). Nesse ponto, uma implementação ingênua, mas simples, como sugeri, pode aproximar essas cores, dificultando a visualização do que está acontecendo. É quando você pode usar a coloração do gráfico para garantir que você esteja usando cores distantes para linhas "fechadas" no gráfico.
Joris Timmermans
@ Dukeling - editei minha resposta para incluir sua observação sobre por que reutilizar a mesma cor pode ser ruim.
Joris Timmermans
1

Para o caso em que você não conhece antecipadamente quantas cores distintas precisará de outro algoritmo interessante, é o algoritmo da proporção áurea .

Simplesmente comece com a sua cor favorita e, em seguida, rode a roda de cores em passos do ângulo dourado (137,5 °). Com esse ângulo, você garantirá que, após cada convolução na roda de cores, suas novas cores caiam entre as cores que você já criou.

O ângulo entre florzinhas sucessivas em algumas flores é o ângulo de ouro.

(Imagem da wikipedia )

Roman Reiner
fonte
0

Eu experimentei um pouco e descobri que, mesmo com HSL / HSV, não é fácil obter um algoritmo decente para cores agradáveis, imperturbáveis ​​e calmantes (todas bastante subjetivas, mas ...) e ainda contrastantes. Algumas partes do espectro são visualmente semelhantes - esp. a seção verde-azul. Então eu tive que adicionar alguma variação de leveza.

Aqui está o que eu acabei com:

insira a descrição da imagem aqui

$.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();
    })
});
Ondra Žižka
fonte