Como criar uma sequência de cores do arco-íris que não pareça amadora
A maioria das pessoas peca na hora de gerar uma sequencia cores arco iris porque simplesmente pega os seis ou sete tons e joga um sobre o outro sem transição. O resultado é uma faixa visualmente barulhenta que cansa a vista. O problema real não é escolher as cores, mas sim definir o espaço de cor e a curva de interpolação correta antes de qualquer coisa.
Gerando uma sequencia cores arco iris com precisão
O método mais confiável que eu uso é trabajar no espaço HSV (Matiz, Saturação, Valor) em vez de RGB direto. Você define o matiz percorrendo de 0 a 360 graus, mantendo saturação e valor constantes, e depois converte para RGB no final. Assim você garante que todas as cores tenham a mesma intensidade perceptual e não surjam tons acinzentados no meio do caminho. Na prática, isso funciona assim: você cria um array de 256 posições, calcula o passo de matiz dividindo 360 por 255, e preenche cada índice com o valor HSV correspondente. A conversão HSV para RGB é uma função padrão que existe em praticamente qualquer biblioteca de manipulação de imagem. Se estiver usando Python, o módulo `colorspice` ou até mesmo a conversão manual com `colorsys` resolve em três linhas de código.
Dica prática: não use sempre 256 cores. Dependendo da aplicação, 64 ou 128 cores são mais do que suficientes e reduzem drasticamente o peso do arquivo se você for salvar como paleta indexada.
Pegadinhas que ninguém conta sobre a sequência do arco-íris
Uma coisa que eu descobri na prática e que nunca vi em tutorial algum é o problema do gap de magenta. Quando você percorre o matiz de 0 a 360, o vermelho aparece tanto no início quanto no final. Se a sua aplicação exigir que a sequência seja ciclica — como em visualizações de dados circulares ou em LED matrices que ficam em loop — a transição entre o último e o primeiro tom fica abrupta. Vermelho puro para vermelho puro não é um problema, mas se você usar uma interpolação linear simples, o final da paleta pode parecer ligeiramente diferente do início por causa de arredondamento de ponto flutuante. A solução que eu adotei foi simples: duplicar o primeiro tom no final do array e depois remover o último elemento após a geração. Isso garante continuidade perfeita. Outra alternativa é usar o espaço de cor LCh (luminosidade, cromaticidade, matiz) do CIE, que é perceptualmente uniforme. O resultado é muito mais suave, especialmente nas regiões de azul e verde onde o HSV tende a gerar saltos de luminosidade não intencionais.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Codificação rápida para diferentes plataformas
Se você precisa disso rodando em JavaScript para web, a função a seguir gera a paleta em CSS custom properties: const total = 256;
for (let i = 0; i < total; i++) {
const hue = (i / (total - 1)) * 360;
document.documentElement.style.setProperty('--rainbow-' + i, `hsl(${hue}, 100%, 50%)`);
}
Para Python, exportar como arquivo PNG indexado com a paleta gerada: from PIL import Image
img = Image.new('P', (256, 1))
palette = []
for i in range(256):
h = (i / 255) * 360
from colorsys import hsv_to_rgb
r, g, b = [int(x * 255) for x in hsv_to_rgb(h / 360, 1.0, 1.0)]
palette.extend([r, g, b])
img.putpalette(palette)
img.save('rainbow.png')
Quando NÃO usar uma sequência arco-íris
Existem cenários em que essa abordagem é problemática e é bom saber identificar antes de gastar tempo implementando. Dados quantitativos sensíveis a diferenças sutis de tonalidade, como mapas de calor médicos ou gráficos estatísticos acadêmicos, sofrem com a non-linearidade perceptual do arco-íris tradicional. O olho humano percebe mudanças de verde-Amarelo de forma muito mais aguda do que mudanças de Azul-Vermelho. Isso cria falsas fronteiras visuais que não correspondem à realidade dos dados. Nesses casos, eu recomendo fortemente o uso de paletas perceptualmente uniformes como viridis, plasma ou cividis. Elas são projetadas especificamente para eliminar esses artefatos. O arco-íris serve para decoração, interfaces lúdicas, efeitos visuais e prototipagem rápida. Não serve como ferramenta de análise de dados séria.
Outro ponto: se o seu projeto precisa funcionar em condições de daltonismo, a sequência tradicional falha em vários pontos. A região verde-amarela e a região azul-verde são particularmente problemáticas para protanopia e deuteranopia. Uma paleta como rainbowblind, disponível em bibliotecas como o ColorBrewer, resolve isso mantendo a variabilidade de matiz enquanto preserva a distinguibilidade. Se você estiver exportando a paleta para uso em hardware embarcado — como controladores LED via ESP32 ou Arduino — lembre-se de fazer o downscale para 8-bit por canal. Cores de 10-bit ou 12-bit geram arquivos maiores sem ganho perceptível na maioria dos displays. A diferença entre 256 e 1024 níveis numa sequência de gradiente é praticamente imperceptível ao olho nu em condições normais de iluminação.