如何生成对比色?

Rol*_*ien 6 language-agnostic colors

我的应用程序包含一个可以一次显示20个或更多数据集的折线图,但通常它会显示少于5.我希望每个数据集都有一个独特的颜色.

目前我这样做:

setHsl(i * 255.0 / session->getNumDataSets(), 255, 128);
Run Code Online (Sandbox Code Playgroud)

它有效,但缺点是两个连续的数据集将具有非常相似的颜色.我希望它能使生成的每种颜色尽可能地与之前生成的所有颜色形成对比.

什么是产生颜色的更好方法?

这是我的第二次尝试:

double pos = 0;
if (wheel.size() == 0)
{
    wheel.append(0.0);
    wheel.append(1.0);
}
else
{
    double gap = 0;
    double hi = 0;
    double lo = 0;

    for (int i = 0; i < wheel.size() - 1; i++)
    {
        double g = wheel[i + 1] - wheel[i];
        if (g > gap)
        {
            gap = g;
            lo = wheel[i];
            hi = wheel[i + 1];
        }
    }

    pos = (hi - lo) / 2.0 + lo;

    wheel.append(pos);
    qSort(wheel);
}

QColor c;
c.setHsl(pos * 255.0, 255, 128);
return c.toRgb();
Run Code Online (Sandbox Code Playgroud)

我的想法是第一种颜色,是色轮上的位置0.然后对于每一种颜色,我绕着色轮,寻找颜色之间的最大差距,一旦我找到它,我就在这个间隙中插入一种新颜色.它似乎工作得更好,但仍然不完美,因为一旦间隙变小,连续的颜色再次变得相似.

Erg*_*wun 5

我知道您正在寻找一种计算生成图形颜色的方法,但您可能需要考虑设计自定义调色板并从预先存储的表中查找颜色.

这样做的好处是,您可以为色盲用户制作更容易区分的颜色选择.您可以使用VisCheck之类的工具来查看图表对色盲用户的显示效果.

如果您可能有超过20个数据集,我想可能很难仅通过颜色来区分,但颜色可以与其他微分器(如虚线)结合使用.


Rei*_*ien 3

你可以这样做:

int n = session->getNumDataSets();
setHsl( (((i%3) * n/3)+(i/3)) * 255.0 / n, 255, 128);
Run Code Online (Sandbox Code Playgroud)

我必须仔细检查我的数学,但基本上它会旋转三分之一的频谱。