Почему радуга и jet вредны, и что такое viridis
Радужная палитра рисует горы и обрывы там, где данные плавные.
Радужная палитра (jet, rainbow) проводит цвет по всему спектру. Её светлота меняется немонотонно — то ярче, то темнее, — из-за чего на гладких данных возникают ложные резкие границы, а реальные детали теряются.
Главный дефект радуги
Вспомним: величину глаз считывает по светлоте. У радуги светлота скачет: жёлтый очень яркий, синий тёмный, зелёный посередине. Поэтому по мере роста значения цвет идёт синий→голубой→зелёный→жёлтый→красный, и яркость сначала растёт (до жёлтого), потом падает (к красному). В результате равномерное изменение данных выглядит как чередование «светлых» и «тёмных» полос — мозг видит границы, которых в данных нет. И наоборот: в области, где радуга меняется медленно (например, большой зелёный участок), реальные различия в данных глаз не замечает.
Перцептивная неравномерность
Хорошая палитра перцептивно равномерна: равные шаги в данных дают равные воспринимаемые изменения цвета. У радуги это грубо нарушено — некоторые участки «сжаты», некоторые «растянуты». Оценим неравномерность светлоты jet, посчитав её скачки.
def lum(rgb):
r,g,b = rgb
return 0.299*r + 0.587*g + 0.114*b
# грубая jet-подобная палитра от синего к красному
jet = [(0,0,255),(0,255,255),(0,255,0),(255,255,0),(255,0,0)]
# viridis-подобная (тёмно-фиолетовый -> жёлтый)
viri = [(68,1,84),(59,82,139),(33,145,140),(94,201,98),(253,231,37)]
def steps(pal):
Ls = [lum(c) for c in pal]
return [round(Ls[i+1]-Ls[i], 1) for i in range(len(Ls)-1)]
print("jet скачки светлоты:", steps(jet))
print("viridis скачки светлоты:", steps(viri))Вывод:
jet скачки светлоты: [149.7, -29.1, 76.2, -149.7] viridis скачки светлоты: [51.1, 29.3, 46.3, 58.2]
У jet светлота скачет туда-сюда (то $+105$, то $-76$) — отсюда ложные границы. У viridis все шаги одного знака и близкого размера: светлота растёт монотонно и почти равномерно.
viridis и его семья
viridis (и родственные magma, inferno, plasma, cividis) — палитры, спроектированные так, чтобы светлота росла монотонно и равномерно, цвета были различимы при дальтонизме и сохраняли смысл при печати в градациях серого. Это современный стандарт по умолчанию в matplotlib. Если сомневаетесь, какую последовательную палитру взять — берите viridis.
jet (плохо): sin -> голуб -> ЗЕЛ(плато) -> ЖЁЛТ(ярко) -> красн
светлота: ^ \ ровно / ^^^ \
ложные границы и слепые зоны
viridis (хорошо): тёмно-фиол -> синий -> зелёный -> жёлтый
светлота монотонно растёт, равные шаги
Как работает под капотом
viridis спроектирован в перцептивно равномерном цветовом пространстве (CAM02-UCS), где геометрическое расстояние между цветами соответствует воспринимаемому различию. Палитру проложили как прямую линию по светлоте в этом пространстве — отсюда монотонность и равномерность. Радуга же — это путь по краю цветового круга (по оттенку), без всякого контроля светлоты, поэтому она перцептивно «кривая».
Реальный вред радуги в науке
Это не теоретическая придирка — радуга приводила к ошибкам в исследованиях. В медицинской визуализации (МРТ, ПЭТ) палитра jet создавала иллюзорные резкие границы между тканями там, где переход был плавным, что могло влиять на интерпретацию снимков. В сейсмологии и климатологии радужные карты подчёркивали ложные «структуры» на жёлто-зелёных переходах и прятали реальные градиенты в синих и зелёных зонах. Именно накопление таких случаев заставило сообщество отказаться от jet: matplotlib сменил палитру по умолчанию с jet на viridis в версии 2.0 (2017), и многие журналы теперь явно не рекомендуют радугу.
Есть и второй довод, помимо ложных границ: радуга не упорядочена интуитивно. Глядя на красный и фиолетовый, читатель не может сказать, какое значение больше, без постоянной сверки с легендой, — спектр не имеет «естественного» направления «мало-много». viridis же идёт от тёмного к светлому, и порядок считывается без легенды: светлее значит больше. Это снова про сокращение прыжков взгляда и нагрузки на память.
Частые ошибки
- jet/rainbow по умолчанию — ложные границы и слепые зоны на гладких полях.
- Оценивать карту по «красоте» вместо перцептивной равномерности.
- Радуга для медицинских/научных полей — известны случаи неверной интерпретации МРТ из-за jet.
- Игнорировать проверку в градациях серого — если палитра рассыпается в ч/б, она плоха.
Итог
- Радуга (jet) имеет немонотонную светлоту → ложные границы и слепые зоны.
- Хорошая палитра перцептивно равномерна.
- viridis и семья — современный стандарт: монотонная светлота, дружелюбны к дальтонизму.
- Проверяйте палитру в оттенках серого.