Recomiendo usar los espacios de color HSV o HSL, no el espacio de color RGB, porque HSV y HSL están mejor estructurados para generar colores que se ven diferentes a los humanos. Tendrá más trabajo en RGB (aunque existen conversiones de ida y vuelta, en caso de que las necesite).
Así es como se ve HSV / HSL:
Al utilizar el espacio de color HSV o HSL, puede suponer (muy aproximadamente) que la diferencia entre los componentes H (tono) de dos colores es una buena aproximación de la distancia perceptiva entre los colores, es decir, cuanto mayor sea el cambio de tono, mayor será Los colores serán diferentes para los humanos. Puedes intentar jugar con S (saturación) y L / V (luminosidad / valor) para obtener algunos colores más diferentes, pero no se verán tan diferentes para el mismo cambio de valor como para variar el tono.
Dependiendo de la cantidad de colores distintos que necesite, puede dividir el espacio de matiz en esa cantidad de colores diferentes. Si, por ejemplo, tiene un rango de tono de 256 valores y necesita 16 colores distintos, entonces su primer color podría ser (0, 128, 128), su segundo (16, 128, 128) y así sucesivamente. Elegí algo arbitrariamente los valores S / L justo en el medio aquí, ya que generalmente será lo suficientemente ligero y saturado como para ver claramente las diferencias de color. Este sistema es simple y supone que no necesita saber nada sobre la adyacencia de colores en su gráfico / mapa.
Si no sabe de antemano cuántos colores distintos necesita, pero conoce el límite superior, y dividir el rango de matices en colores teniendo en cuenta ese límite superior como se indica arriba todavía le da buenos colores perceptualmente diferentes, entonces puede usar el mismo sistema El límite superior.
Si (podría) necesitar muchos colores distintos, aún podría salirse con la suya usando colores muy similares o incluso los mismos, siempre que no aparezcan cerca de los otros elementos del gráfico que tienen el color similar. Esto requiere conocer su situación de adyacencia en el gráfico que está renderizando y puede que no siempre sea sencillo, e incluso entonces puede que no sea una buena idea como Dukeling señala en los comentarios: puede ser confuso para los espectadores que se use el mismo color dos veces en el gráfico para dos conceptos diferentes.
Entonces, finalmente, en la situación más compleja, su gráfico es lo suficientemente complejo como para no tener suficiente espacio de color para garantizar que no termine con elementos distintos con colores que son demasiado similares usando el sistema anterior. En este caso, necesita construir un gráfico de adyacencia de elementos de su gráfico de visualización. La adyacencia aquí es un concepto difuso: tendrá que definirlo correctamente para su situación real. Por ejemplo, en su segundo ejemplo, los datos del 12 de julio tienen un punto de estrangulamiento donde cada color es adyacente a todos los demás. Un enfoque que puede ayudarlo si puede construir el gráfico de adyacencia es el problema del color del gráfico : hay bibliotecas que pueden ayudarlo, por ejemplo boost :: graph en C ++ .