Наносим линейный тренд на график временного хода в MATLAB

Сегодня мы нанесём линию тренда с доверительными интервалами на график временного ряда.

Работать мы будем с теми же данными (среднемесячные значения индекса NAO), с которыми работали в предыдущей заметке про добавление дат на график временного хода.

nao = load('norm.nao.monthly.b5001.current.ascii.txt');

Для того, чтобы тренд был явно выражен мы выбрали только последние несколько лет (да-да, это тот самый случай, когда учёные манипулируют с данными, никогда так не делайте в своей научной работе):

dates = datetime(nao(750:end,1),nao(750:end,2),15);
nao=nao(750:end,3);

Построим график для того, чтобы представлять, с чем имеем дело (параметр 'k' делает линию чёрной, а 'LineWidth' устанавливает толщину линии):

plot(dates, nao,'k','LineWidth',2)
Индекс NAO

Тренд здесь хорошо заметен. Если вам нужно удалить линейный тренд из данных, то сделать это можно при помощи простой функции detrend:

Читать далее «Наносим линейный тренд на график временного хода в MATLAB»

Добавление дат на график временного ряда в MATLAB

При работе с временными рядами часто требуется их визуализировать. Однако, для того, чтобы отложить по оси Х даты нужно немного специальных навыков работы с датами. Начнём мы с более старого сценария работы, который до сих пор может быть актуален, если у вас версия матлаба старее 2014 года. Также полезно будет его изучить, если вы будете разбираться в старых кодах.

Итак, наиболее классическим является вариант представления даты в виде, так называемого, serial date number. Например, 14 октября 1992 года в этой сиситеме будет равняться 727851:

datenum(1992, 10, 14)

ans =

      727851

Не сложно догадаться, что функция datenum как раз таки и переводит "человеческую" дату в этот формат. Само число при этом (в нашем случае число 727851) - это количество дней прошедших с первого января нулевого года ('Jan-1-0000 00:00:00').

Вообще говоря, вышеупомянутое обращение к функции datenum - не единственно возможное. Можно, например, так:

datenum('12-jun-17','dd-mmm-yy')

ans =

      736858

Аргумент 'dd-mmm-yy' даёт матлабу пояснение - в каком виде представлена наша дата. Видов этих может быть много, так год можно представить из четырёх цифр (yyyy) или из двух (yy), месяц записать полностью буквами (mmmm), трёхбуквенным сокращением (mmm), двумя цифрами (mm) или одной буквой (m) и т.д. Полный список вариантов можно найти в хэлпе к функции datenum. Иными словами, вы можете собирать дату как конструктор, главное рассказать матлабу, что вы имеете ввиду, например:

datenum('12--:06_+2017','dd--:mm_+yyyy')

ans =

      736858

Ну и на всякий случай скажем, что если вы хотите перевести дату обратно к текстовому виду, то сделать это можно так:

datestr(728447)

ans =

    '02-Jun-1994'

а если к раскидать дату в виде чисел и записать в матрицу, то так:

datevec(728447)

ans =

        1994           6           2           0           0           0

Давайте попробуем с этим поработать на конкретном примере. Для этого скачаем данные с ежемесячными значениями индекса NAO с сайта noaa, а именно Monthly mean NAO index since January 1950 - Ascii format for downloading.

Загрузим скачанные данные в MATLAB:

nao = load('norm.nao.monthly.b5001.current.ascii');
Первый столбец - годы, второй - месяцы, третий - значения индекса NAO

Сам временной ряд выглядит так:

Читать далее «Добавление дат на график временного ряда в MATLAB»

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

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

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

Colormap jet MATLAB

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

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

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

Настраиваем прозрачность для NaN при построении с использованием texturemap в MATLAB

В одной из наших предыдущих заметок мы визуализировали данные SST на карте. И в той заметке зашла речь о том, что при нанесении данных на карту, используя метод 'texturemap' в функции geoshow, области с пропущенными значениями (NaN) закрашиваются цветом. Например, используя те же данные SST, построим карту для немного другог района:

worldmap([42 78],[-50 180])
setm(gca,'MapProjection','mercator')

Раньше такая конструкция работала, но теперь, по неведомой мне причине MATLAB начал ругаться: "Error using setm (line 41)
Expected H to be a handle to a MATLAB graphics object." Просит сделать указатьель (насколько я понимаю, как на русский язык переводится слово Handle, или ещё называют "дескриптор", что быть может даже более прпвильно), не хочет обращаться к карте при помощи gca. Ладно, сделаем через этот самый hadle.

k = worldmap([42 78],[-50 180])
setm(k,'MapProjection','mercator')

Теперь получилось построить подложку карты, осталось нанести данные:

k = worldmap([42 78],[-50 180])
setm(k,'MapProjection','mercator')
geoshow(lat,lon,sst,'displaytype','texture') 
caxis([-2 25])
geoshow('landareas.shp','FaceColor',[0.5 0.5 0.5])
colormap jet
colorbar
Нанесение данных на карту в MATLAB

Как мы и предупреждали, значения  NaN имеют тёмно синий цвет, что не есть хорошо, так как неотличимы от значений с низкими температурами. Одно из решений мы обсуждали в прошлый раз - заменить 'texturemap' на 'surface':

Читать далее «Настраиваем прозрачность для NaN при построении с использованием texturemap в MATLAB»

Как нарисовать прямоугольник на карте в MATLAB

Часто приходится на карте указывать район нашего исследования, например, если берегов нет или по их очертаниям сразу не определить район. Когда вы показываете маленький район на более крупной и узнаваемой карте, то для зрителя воспринимать ваш доклад, например, будет комфортнее.

Сегодня мы продолжаем цикл заметок посвящённых визуализации в MATLAB и построим на карте прямоугольник, многоугольник,... короче говоря, полигон.

Мы будем идти по стопам прошлой заметки, где мы строили топографическую карту. Поэтому следующий код должен вам оказаться понятен:

[Z, refvec] = etopo('etopo1_ice_c_f4.flt',1, [40 65],[-65 10]);
worldmap ([40 65],[-65 10])
setm(gca,'MapProjection','mercator')
geoshow(Z, refvec, 'DisplayType', 'texturemap');
demcmap(Z)

Получилась такая карта:

Топографическая карта Северной Атлантики, построенная в MATLAB
Читать далее «Как нарисовать прямоугольник на карте в MATLAB»

Как построить цветную топографическую карту в MATLAB

Сегодня мы построим топографическую карту (карту рельефа) для всего мира, а также для отдельных районов, используя средства MATLAB. Нам как океанологам, конечно, важна её батиметрическая часть, но строить мы будем и "сухопутную" часть тоже. Сегодня ограничимся только картой, где топография отлита цветом. Изолинии будем рисовать в другой раз.

Начнём с того, что используем родной файл с топографией, который встроен в MATLAB. 

load topo

В результате этой команды откроются несколько переменных, главная из которых topo, в которой и содержатся нужные нам значения высот

whos
  Name              Size              Bytes  Class     
  topo            180x360            518400  double              
  topolatlim        1x2                  16  double              
  topolegend        1x3                  24  double              
  topolonlim        1x2                  16  double              
  topomap1         64x3                1536  double              
  topomap2        128x3                3072  double              

В прошлый раз (советуем прочитать тот материал, прежде чем читать дальше) для построения карты мы использовали матрицы с широтами и долготам, равные по размерам матрице с данными. Здесь же нет даже векторов, из которых мы эти матрицы можем сделать. Но на самом деле, при равномерной координатной сетке мы можем обойтись и без них. Поэтому сейчас мы построим карту немного другим способом (отличным от того, которым пользовались ранее).

Если мы знаем размер матрицы с топографией и знаем пределы этой карты (по широте и долготе), то можно сказать, что наша координатная сетка нам известна. Функция georefcells по пределам широт и долгот, а также размеру матрицы topo создаст в матлабе референсную ячейку, которую впоследствии мы сможем использовать для построения:

topoR = georefcells(topolatlim,topolonlim,size(topo))

Теперь осталось дело за малым -  построить карту:

worldmap('world')
geoshow(topo,topoR,'DisplayType','texturemap')
топографическая карта MATLAB

Для того, чтобы цвета выглядели более привычно для географа, лучше воспользоваться функцией demcmap, которая создаст специальную цветовую политру (colormap), подходящую для отображения рельефа.

worldmap('world')
geoshow(topo,topoR,'DisplayType','texturemap')
demcmap(topo)
Цветовая палитра для топографической карты

Что ж, карта готова.  Но что, если мы хотим построить карту не для всего Мирового океана, а лишь для небольшого района?

Читать далее «Как построить цветную топографическую карту в MATLAB»