我建议使用HSV或HSL颜色空间,而不是RGB颜色空间,因为HSV和HSL的结构更好,可生成看起来与人类不同的颜色。您将在RGB上做更多的工作(尽管存在来回转换,如果需要的话)。
这就是HSV / HSL的样子:
在使用HSV或HSL色彩空间时,您可以(非常粗略地)假设两种颜色的H(色相)分量之间的差异很好地近似了两种颜色之间的感知距离-即色相变化越大,则不同的颜色将呈现给人类。您也可以尝试使用S(饱和度)和L / V(亮度/值)来产生更多其他非常不同的颜色,但是对于相同的值更改而言,它们看起来并不像改变色相一样。
根据所需的不同颜色的数量,可以将色相空间划分为该数量的不同颜色。例如,如果色相范围为256个值,并且需要16种不同的颜色,则第一种颜色可能是(0,128,128),第二种颜色是(16,128,128),依此类推。我在这里中间随意选择了一些S / L值,因为通常它们很轻且饱和,足以清楚地看到颜色差异。该系统很简单,并且假定您对图形/地图中的颜色邻接一无所知。
如果您事先不知道需要多少种不同的颜色,但您知道上限,并且将色相范围划分为考虑到上限的颜色,如上所述,仍然可以给您提供良好的感知上不同的颜色,那么您可以使用相同的系统上限。
如果(可能)需要非常多种不同的颜色,则只要它们不会出现在图形中具有相似颜色的其他元素附近,您仍然可以避免使用非常相似甚至相同的颜色。这需要了解您要绘制的图形中的邻接情况,并且可能并不总是那么直接,即使那样,正如Dukeling在评论中指出的那样,可能也不是一个好主意:使用相同的颜色可能会使观众感到困惑在图表中针对两个不同的概念两次。
因此,最后在最复杂的情况下,您的图形非常复杂,以至于您没有足够的色彩空间来确保最终不会出现使用上述系统时颜色过于相似的独特元素。在这种情况下,您需要构建可视化图元素的邻接图。邻接关系是一个模糊的概念-您将必须根据实际情况正确定义它。例如,在您的第二个示例中,7月12日的数据有一个阻塞点,其中每种颜色彼此相邻。如果可以建立邻接图,一种可以帮助您的方法是图形着色问题-有一些库可以为您提供帮助-例如C ++中的boost :: graph。