Существуют ли алгоритмы генерации цвета? - PullRequest
3 голосов
/ 16 июля 2010

Есть ли хороший алгоритм для генерации цветов для использования на графиках, таких как линейные / круговые / гистограммы? Практически все графики имеют встроенный список цветов, которые они автоматически присваивают добавляемым элементам. Но иногда вам нужно вручную назначать цвета, и в этом случае вы захотите избежать ручной вставки цветов самостоятельно, что отнимает много времени и, вероятно, приведет к плохим результатам, тогда как алгоритм мог бы сделать это намного лучше.

Сгенерированные цвета должны иметь следующие свойства:

  • Быть легко отличимыми друг от друга : по мере добавления все большего числа элементов возрастает вероятность путаницы и неправильного толкования. Поэтому важно, чтобы цвета были настолько легко различимы, насколько это возможно, особенно цвета, которые близки друг к другу в списке цветов. Конфликты приемлемы, хотя, очевидно, их желательно избегать.

  • Сначала содержат классические цвета : когда на графике присутствует несколько элементов, красный, синий, темно-оранжевый, зеленый, серый цвета должны идти в первую очередь, а менее легко различимые - после .

В настоящее время я просто использую список цветов, который где-то нашел, и если у меня больше элементов, чем список цветов, этот список используется повторно, что иногда приводит к коллизиям цветов.

$default_colors = array(
    "#4684ee", "#dc3912", "#ff9900", "#008000", "#666666",
    "#4942cc", "#cb4ac5", "#d6ae00", "#336699", "#dd4477",
    "#aaaa11", "#66aa00", "#888888", "#994499", "#dd5511",
    "#22aa99", "#999999", "#705770", "#109618", "#a32929",
);

Есть ли там такая функция? Я посмотрел, но мой Google-фу не был достаточно силен.

1 Ответ

2 голосов
/ 16 июля 2010

Работа с цветовым пространством HSV - это, вероятно, лучший способ.Вдобавок ко всему, вот возможный алгоритм, который вы могли бы изменить в соответствии со своими вкусами.

  • пусть N будет количеством нужных вам цветов
  • пусть v = ceil(N / 6) будет количество различных значений, которые будут использоваться
  • пусть h = min (N, 6) будет количество различных оттенков, которые будут использоваться
  • использовать значения
    1, 1-1 / v, ..., 1 - (v-1) / v
    каждый с оттенками
    0, 1 / ч, ..., (h-1) / ч

Это дает вам h * v разных цветов, сэмплирует цветовое пространство с полной насыщенностью с довольно равномерным распределением, максимально долго избегает темных цветов и в первую очередь предлагает первичные цвета.

Если вам нужно еще больше цветов, вы также можете включить насыщенность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...