Логарифмическая цветовая шкала при построении карты в MATLAB

Иногда мы сталкиваемся с ситуацией, когда при построении карты, нам нужна логарифмическая цветовая шкала. Делается это довольно просто.

Для нашего примера скачаем данные о концентрации хлорофилла (осреднённые за всё время измерений) с сайта Oceancolor.

Загрузим скачанные данные в Workspace и построим карту с распределением (если не понимаете что происходит в коде, приведённом ниже, то почитайте побольше заметок на koldunov.ru):

chl=ncread('A20021852019212.L3m_CU_CHL_chlor_a_9km.nc','chlor_a');
lat=ncread('A20021852019212.L3m_CU_CHL_chlor_a_9km.nc','lat');
lon=ncread('A20021852019212.L3m_CU_CHL_chlor_a_9km.nc','lon');
[lon,lat]=ndgrid(lon,lat);
worldmap('world')
geoshow(lat,lon,chl,'DisplayType','texture')
colorbar

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

Читать далее «Логарифмическая цветовая шкала при построении карты в MATLAB»

Как уменьшить расстояние между картой и значениями долгот в MATLAB

В прошлый раз мы избавились от пустого пространства вокруг построенной карты в MATLAB. Однако, если вы не умеете этого делать, то жизнь ваша не станет такой уж сложной, ведь для обрезки пустого пространства картинки достаточно использовать любой редактор изображений с функцией кадрирования ("crop") . Сегодняшняя тема - другое дело, здесь так просто не отделаться. Вернёмся к нашей карте:

worldmap([50 70],[-60 20])
setm(gca, 'mlabellocation',[-60:10:20])

Допустим, вы хотите подвинуть значения долгот ближе к координатным осям. Сделать это, воспользовавшись всё тем же приложением для редактирования изображений, уже не такая простая задача, ведь оси изогнуты. Вы не можете подвинуть все подписи одновременно вверх лёгким движением руки. Поэтому тут решение должно быть при построении на программном уровне. К моему удивлению, поиск решения данной проблемы занял у меня значительное время. Хотя решение моё достаточно простое, есть ощущение, что должно быть какое-то, скажем так, более "правильное" решение. Но что есть то есть.

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

Читать далее «Как уменьшить расстояние между картой и значениями долгот в MATLAB»

Убираем пустое пространство вокруг карты в MATLAB

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

Для начала посмотрим на проблему. Сделаем простейшее построение карты в MATLAB:

worldmap([50 70],[-20 20])

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

Теперь попробуем немного усугубить ситуацию:

worldmap([50 70],[-60 20])

И вот мы видим MATLAB во всей своей красе. Автоматика при построении карт работает отвратительно и уже много лет MATLAB не хочет с этим ничего делать. Во-первых, значения долгот неприлично близко расположены друг к другу, но давайте это сразу поправим:

Читать далее «Убираем пустое пространство вокруг карты в MATLAB»

Как сделать анимацию в MATLAB и сохранить её в формате GIF

В прошлой заметке мы с вами создавали видеролик при помощи MATLAB. Иногда полезно иметь анимацию не в видео формате, а в виде популярного в интернете формата GIF.

За основу мы возьмём код и данные, которые использовали в вышеупомянутой заметке:

for n =1:365
worldmap('world')
setm(gca,'Origin', [0 180 0])
geoshow(lat,lon,air(:,:,n),'displaytype','texture')
geoshow('landareas.shp','FaceColor','none','EdgeColor','w')
caxis([-80 40])
cmocean('thermal')
colorbar
title(datestr(t(n)))
frame(n) = getframe(gcf);
close(gcf)
end

v = VideoWriter('air_temp2018.mp4','MPEG-4');
v.FrameRate = 10;
open(v)
writeVideo(v,frame)
close(v)

Напомню, что первая часть строит все нужные нам картинки (отдельные кадры будущего видео) и записывает их в переменную frame. Затем, используя эту самую переменную frame во второй части кода мы создаём их этих кадров видеоролик. Сейчас эта вторая часть нам не понадобится, мы теперь используем переменную frame для создания GIF. Давайте я сначала сразу приведу здесь готовый код, а уже потом сделаю некоторые пояснения:

Читать далее «Как сделать анимацию в MATLAB и сохранить её в формате GIF»

Как сделать анимацию в MATLAB и сохранить видео в формате mp4

Часто учёным намного проще анализировать данные, когда они представлены в виде анимации. Сегодня мы сделаем простую анимацию в MATLAB и сохраним её в виде видео-файла в формате MPEG-4.

Для построения картинок мы будем использовать NCEP/NCAR Reanalysis с этого сайта. Я скачал ежедневные значения температуры воздуха у поверхности для 2018 года. Если хотите себе такие же, прямая ссылка вот.

Для начала загрузим наши данные в рабочую область Matlab:

air = ncread('air.sig995.2018.nc','air')-273.15;
lat = ncread('air.sig995.2018.nc','lat');
lon = ncread('air.sig995.2018.nc','lon');

Обратите внимание, что мы вычли 273.15 из значений температуры, для того чтобы перевести их в градусы Цельсия (исходные данные в Кельвинах). Для последующих построений нам нужно будет перевести векторы lat и lon в матрицы:

Читать далее «Как сделать анимацию в MATLAB и сохранить видео в формате mp4»

Как построить вертикальные профили солёности и температуры воды на одном графике в MATLAB

Сегодня мы построим графики распределения значений солёности и температуры воды по глубине.

Работать мы будем с данными World Ocean Atlas 2013 V2. Вместо того, чтобы скачивать .nc файлы целиком, для удобства загрузим с сервера только нужные нам переменные. Делается это при помощи протокола OPENDAP.

Нам потребуются пять переменных: температура (запишем в переменную t_global), солёность (s_global), широта (lat), долгота (lon) и глубина (z). Запускаем на закачку прямо в MATLAB:

t_global = ncread('https://data.nodc.noaa.gov/thredds/dodsC/woa/WOA13/DATAv2/temperature/netcdf/decav/1.00/woa13_decav_t00_01v2.nc','t_an');
lat = ncread('https://data.nodc.noaa.gov/thredds/dodsC/woa/WOA13/DATAv2/temperature/netcdf/decav/1.00/woa13_decav_t00_01v2.nc','lat');
lon = ncread('https://data.nodc.noaa.gov/thredds/dodsC/woa/WOA13/DATAv2/temperature/netcdf/decav/1.00/woa13_decav_t00_01v2.nc','lon');
z = ncread('https://data.nodc.noaa.gov/thredds/dodsC/woa/WOA13/DATAv2/temperature/netcdf/decav/1.00/woa13_decav_t00_01v2.nc','depth');
s_global = ncread('https://data.nodc.noaa.gov/thredds/dodsC/woa/WOA13/DATAv2/salinity/netcdf/decav/1.00/woa13_decav_s00_01v2.nc', 's_an');
Читать далее «Как построить вертикальные профили солёности и температуры воды на одном графике в MATLAB»

Градусы в научных текстах

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

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

Книга «Справочник издателя и автора» Аркадий Мильчин, Людмила Чельцова - купить на OZON.ru книгу с быстрой доставкой | 978-5-98062-110-0 Книга «Справочник издателя и автора» Аркадий Мильчин, Людмила Чельцова - купить на OZON.ru книгу с быстрой доставкой | 978-5-98062-110-0

С виду, эта толстая книга (1010 страниц) выглядит как собрание скучных правил и норм. Отчасти оно так и есть, но если в вашей работе вам нужно готовить какие-либо тексты, а вы никогда этому не учились, то книга может показаться интереснее любого научнопопулярного бестселлера. При прочтении постоянно ловишь себя на мысли "ого, ведь это важно, а я никогда не придвал этому значения". Сначала я подумал сделать выжимку из этой книги с описанием основных ситуаций, с которыми может столкнуться учёный при написании научных работ. Однако вскоре стало понятно, что такая выжимка будет слишком большой и её придётся делить, на темы, создав цикл заметок. Но и при таком подходе, начав писать текст я стал понимать, что фактически пересказываю всю книгу целиком, что является плохой идеей со многих точек зрения. В итоге я решил оставить глобальные идеи и время от времени размешать здесь совсем коротенькие заметки, не объеденённые какой-то общей темой, а просто кажущиеся мне достойными вашего внимания.

Читать далее «Градусы в научных текстах»

Notebook interface внутри MATLAB

Многие учёные, работающие с данными любят писать код не в виде голых скриптов, а используя так называемый notebook interface (типичный пример - Jupyter Notebook). Удобно это прежде всего потому, что ваш код становится более понятным, комментарии к коду хорошо читаются, а главное, прямо между строк можно вставлять результаты выполнения кода, например, полученные графики и построения.

В 2016 году MATLAB тоже создал свой вариант такого интерфейса, но на самом деле я пока не часто вижу, что им кто-то пользуется. Одна из причин (именно она побудила меня написать эту заметку) - не все знают об этой возможности MATLAB, хотя найти её совсем не сложно, она буквально постоянно маячит перед глазами (если у вас, конечно, установлен свежий MATLAB).

Итак, Notebook interface в MATLAB называется Live Editor, в которм можно создавать "живые скрипты" (Live Script). Создать такой скрипт можно также, как вы создаёте обычный скрипт (m-файл). На вкладке HOME для этого отведена специальная кнопка "new live script'. Если кнопки не окажется, поищите её под кнопкой "New":

Читать далее «Notebook interface внутри MATLAB»

Наносим линейный тренд на график временного хода в 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»