Javascript 生成N种颜色的调色板—;为了在图表中使用,应尽可能与众不同且相距遥远

Javascript 生成N种颜色的调色板—;为了在图表中使用,应尽可能与众不同且相距遥远,javascript,colors,Javascript,Colors,我正在用几十个数据集构建一个折线图。当它们有很多的时候,区分它们变得越来越困难 我需要一种方法来生成任意数量颜色的调色板,以便颜色尽可能与众不同。这意味着人眼可以很容易地将它们区分开来 我希望颜色鲜艳。Gf00,0f0,00f,ff0,f0f,0ff-首先出现,因为它们在视觉上是最可分辨的(它们不一定是精确的f00,0f0…) 黑色和白色不应出现在调色板中,因为它们是最常见的背景色。或者,可以定义例外情况(以颜色列表或最小/最大亮度的形式) 以下是我尝试过的: 大多数答案来自-一些在小调色板(

我正在用几十个数据集构建一个折线图。当它们有很多的时候,区分它们变得越来越困难

我需要一种方法来生成任意数量颜色的调色板,以便颜色尽可能与众不同。这意味着人眼可以很容易地将它们区分开来

我希望颜色鲜艳。Gf00,0f0,00f,ff0,f0f,0ff-首先出现,因为它们在视觉上是最可分辨的(它们不一定是精确的f00,0f0…)

黑色和白色不应出现在调色板中,因为它们是最常见的背景色。或者,可以定义例外情况(以颜色列表或最小/最大亮度的形式)

以下是我尝试过的:

  • 大多数答案来自-一些在小调色板(9-12种颜色)上看起来非常好,但在30多种颜色上会出现非常接近的颜色,而许多明显的颜色仍然没有使用

    例如,金角是天才,但它只使用了三个维度中的一个,大大限制了颜色的多样性

    我曾尝试将这种方法应用于三维(HSL),但由于三个旋转在逻辑上没有联系,结果相当平庸

  • Google的palette.js-只生成包含单通道颜色的双色渐变和彩虹。随后的每两种颜色都非常接近

  • 库-生成暗淡的调色板,主观上颜色彼此太接近,缺少常见的明亮颜色
  • -完美的结果,但非常缓慢。在速度非常快的PC上生成30种颜色需要几分钟
接受代码段和库建议。理想情况下,输出应该是十六进制颜色字符串或chroma js对象的数组

这是我迄今为止最好的尝试。它使用上面提到的黄金角度方法,但同时旋转色调和亮度

从“lodash es”导入{times};
常数goldenAngle=137.508;
//基于https://stackoverflow.com/a/20129594/901944
功能选择颜色(i){
const hue=i*goldenAngle;//使用黄金角度近似值
常数饱和=100;
常数亮度=((i+50)*黄金角)%30)+20;
返回'hsl(${hue},${saturation}%,${brightness}%)`;
}
导出默认函数选项板(计数){
返回时间(计数,(i)=>selectColor(i));
}


是的,我知道在大调色板上,颜色不可避免地会重复。我想从算法上确保调色板尽可能多样化,对比鲜明。

问题很有趣,但为什么要将其限制在Javascript上?这在任何语言中都是可解的(甚至是纯数学的),最好给出一个一般的答案。对颜色的感知不是线性的。所以这个函数是不精确的。有颜色空间,如“实验室”,使这更准确。