Colormap для отображения океанологических данных

Сегодня мы поговорим о том, какую цветовую шкалу выбрать для отображения океанологических данных.

Я неоднократно натыкался в сети на негативные отзывы по поводу радужных цветовых шкал, к коим относится и цветовая шкала jet (colormap jet), которая до 2014 года использовалась в MATLAB по умолчанию для построения различного рода визуализаций.

Colormap jet MATLAB

Например, в этой заметке рассказывается, как радужная шкала может ввести вас и ваших читателей в заблуждение (особенно это касается интерпретации градиентов визуализируемых характеристик). На самом деле в интернете ещё много подобного рода заметок и даже статей в научных журналах. Не случайно в 2014 году в MATLAB решили изменить colormap, используемый по умолчанию с jet на parula, озвучив в качестве объяснения всё те же причины.

Поводом для моей сегодняшней заметки стал "заказ" коллеги, который, читая материалы koldunov.ru попросил рассказать, как можно использовать цветовую шкалу, отличную от той, что предлагает MATAB. Он признался, что ему не нравится ни одна матлабовская шкала, кроме разве что jet, да и то с натяжкой.  Мне, честно говоря тоже больше всего нравится (или уже нравилась) jet, может быть потому-что она красочная, может быть потому что часто используется и к ней все привыкли. Однако при подготовки ответа на вопрос коллеги, я в очередной раз окунулся в пучину негативных отзывов о радужной шкале и кажется меня эти доводы окончательно убедили в том, что неправильный выбор шкалы может заставить на изображениях видеть то, чего на самом деле нет и не видить того, что на самом деле есть.

Сама структура цветовых карт (колормэпов) не сложная. Её вы можете увидеть, присвоив вывод функции colormap какой-нибудь переменной:

c = colormap(jet)
c =

         0         0    0.5625
         0         0    0.6250
         0         0    0.6875
         0         0    0.7500
         0         0    0.8125
         0         0    0.8750
         0         0    0.9375
         0         0    1.0000
         0    0.0625    1.0000
         0    0.1250    1.0000
         0    0.1875    1.0000
         0    0.2500    1.0000
         0    0.3125    1.0000
         0    0.3750    1.0000
         0    0.4375    1.0000
         0    0.5000    1.0000
         0    0.5625    1.0000
         0    0.6250    1.0000
         0    0.6875    1.0000
         0    0.7500    1.0000
         0    0.8125    1.0000
         0    0.8750    1.0000
         0    0.9375    1.0000
         0    1.0000    1.0000
    0.0625    1.0000    0.9375
    0.1250    1.0000    0.8750
    0.1875    1.0000    0.8125
    0.2500    1.0000    0.7500
    0.3125    1.0000    0.6875...

Матрица c состоит из трёх столбцов, в каждом из которых указана яркость для каналов RGB (Red, Green, Blue).  Иными словами, нет ничего сложного в том, чтобы задать самому цветовую карту. Однако сложно - сделать её красивой. Поэтому обычно люди скачивают готовые варианты, которые могут выглядеть, например, как такой же набор цифр.  

В среде океанологов, пожалуй, одной из наиболее популярных сейчас, является сравнительно новый набор цветовых карт (шкал, колормэпов, как хотите), созданный специально для океанологов - cmocean. Этот пакет имеет специально созданные для разных программ и языков программирования варианты, включая MATLAB, Python, R, Generic Mapping Tools, и Ocean Data Viewer. Если вы хотите поблагодарить авторов, то сошлитесь в своей работе на их статью, которую можете найти здесь (Thyng, K.M., C.A. Greene, R.D. Hetland, H.M. Zimmerle, and S.F. DiMarco. 2016. True colors of oceanography: Guidelines for effective and accurate colormap selection. Oceanography 29(3):9–13).

Сам пакет cmocean для матлаба скачивается с официального сайта MATLAB из раздела fileexchange. Скачиваем, распаковываем и добоавляем путь к нашему пакет в списко пакетов MATLAB (ну или просто помещаем в рабочую папку, еслу вам вдруг так удобнее).

Прежде чем начать пользоваться, давайте познакомимся с вариантами шкал, которые мы теперь сможем использовать:

cmocean MATLAB

Обратите внимание, что название этих шкал говорят сами за себя. Так thermal - хороша для построения температуры, haline - для построения солёности и т.д. Достаточно подробно они представлены с примерами на сайте matplotlib.

Давайте сами тоже построим свой пример, используя данные из прошлых заметок. Например, возьмём в качестве отправной точки одно из наших построений из заметки про построение данных на карте. Как помните, код для построения карты выглядел так:

worldmap([40 80],[-40 20])
geoshow(lat(1:10:end,1:10:end),lon(1:10:end,1:10:end),...
   sst(1:10:end,1:10:end),'displaytype','contour','Fill','on',...
    'LineColor','black','LevelStep',1)
caxis([-2 25])
geoshow('landareas.shp','FaceColor',[0.5 0.5 0.5])
colormap jet
colorbar

А результат так:

Визуализация данных MATLAB

Всё что нам осталось сделать, так это вместо colormap jet написать cmocean('thermal'):

Цветовая шкала для океанологов

В пакете также присутстуют некоторые варианты настройки, позволяющие, например, перевернуть шкалу или инвертировать её цвета.

Upd: Сам же коллега, который спрашивал про colormap в итоге сделал выбор в пользу другого набора - ColorBrewe

 telegram

Чтобы не пропустить новые материалы, подпишитесь на канал в Telegram: https://t.me/koldunovaleksey