Ferret — инструмент для анализа гидрометеорологических данных
Задача: быстро анализировать данные, проверять догадки, создавая карты пространственного и временного распределения характеристик в различных комбинациях
?нструмент: Ferret
Ferret — это интерактивная среда для визуализации и анализа больших наборов метеорологических и океанологических данных, то есть, он может работать с любыми гридированными данными, будь-то вывод моделей или спутниковые продукты. Работает ferret по утверждению создателей на всём, но под виндоуз вам придётся попотеть, чтобы его завести. Можно обрабатывать данные как находящиеся на вашем компьютере, так и данные лежащие в интернете при помощи протокола OPeNDAP. Ferret предлагает подход подобный тому, что используется в пакете Mathematica: новые переменные создаются интерактивно как математические выражения. Расчёты могут быть сделаны для произвольно выбранных районов.
Несмотря на то, что разработчики уверяют, что их детище производит иллюстрации качества пригодного для использования в научных публикациях, это, на мой взгляд, не так. Хоть некоторые действительно вставляют графику Ferret в свои работы, на мой взгляд до уровня PyNGL или GMT ей как до луны. Но, в роли инструмента для анализа ferret очень удобен и тут можно закрыть глаза на качество вывода. Для того, чтобы проверить свою гипотезу или взглянуть на то, не слишком ли далеко модель отдрейфовала от реальности, совсем не нужно располагать графикой высшего разряда, вполне достаточно адекватных картинок. Тут главное, чтобы вы могли создавать эти картинки быстро и интерактивно, а в этом ferret мало кому уступит первенство.
Установка ferret даже под Linux не совсем тривиальное занятие. Я не буду её описывать и отошлю вас к документации. Единственное, что скажу, так это под Ubuntu не пользуйтесь автоматическим созданием ferret_paths файла, просто впишите в него всё вручную. Есть ещё небольшой воркараунд на русском.
Для начала скачаем данные. Основной формат данных для ferret — это netCDF, хотя он понимает также ASCII и бинарные данные, которые в свою очередь также феретом могут быть преобразованы в netCDF. Возьмём данные реанализа по приземной температуре за 2008 год. Это netCDF файл в котором содержатся средне-дневные температуры за каждый день 2008 года. Поскольку качать вы будете этот файл позже меня, то количество дней у вас будет больше, не пугайтесь, это нормально 🙂
Запускаем ferret
NOAA/PMEL TMAP
FERRET v6.1
Linux(g77) 2.4.21-32 - 03/25/08
7-Dec-08 17:24
yes?
Вас встречает приглашение командной строки вопросом «чего изволите» (многие думают что это переводиться как «чё надо?»). Мы изволим загрузить наши данные в ferret и посмотреть что они из себя представляют:
yes? show data
currently SET data sets:
1> ./air.sig995.2008.nc (default)
name title I J K L
AIR mean Daily Air temperature at s 1:144 1:73 ... 1:339
?з строчки информации становится понятно, что в файле содержится одна переменная под именем AIR, что значения в этой переменной представляют собой среднюю температуру на таком-то уровне (на каком укрыто тайной, но на самом деле, это тоже что поверхность), что распределены они на сетке от 1 до 144 по долготе и от 1 до 73 по широте. Вертикальная координата K не занята, что значит у нас только один вертикальный уровень (в нашем случае поверхность). Координата L временная и на момент написания статьи файл содержал 339 дней.
Ну давайте, наконец уже, что-нибудь нарисуем:
Эта строка значит, что мы хотим посмотреть на данные в момент времени L=1. По идее должно всплыть X окошко и отобразить вам температуру воздуха на первое января 2008. Может случиться неприятность, когда ferret заругается на недостаточное количество памяти, скормите ему что-нибудь типа:
он должен успокоиться.
Окно с открывшейся картинкой ни в коем случае не закрывайте, теперь туда будет происходить ваш вывод, и если вы его закроете при следующей попытке вывести какую-нибудь графику ferret погибнет смертью храбрых. Поначалу преодолеть желание закрыть картинку, на которую уже посмотрел и всё про неё понял, довольно сложно.
Результат должен выглядеть примерно так:
Прямо скажем не красавец, но зато всё понятно и информативно. По подписям на графике, для создания которых мы и пальцем не пошевелили, понятно что это, откуда и зачем. Потом, найдя эту картинку в своих закромах вы не будете гадать, что же вы такое имели в виду, и откуда вообще данные взялись.
Температура в Кельвинах, это, конечно, хорошо и очень по-научному, но люди простые типа нас привыкли измерять температуру в Цельсиях, поэтому давайте исправим это небольшое недоразумение. Создадим новую переменную и отрисуем уже её (феррет не различает строчные и прописные, так что AIR и air для него одно и то же):
yes? shade/L=1 airc
Но, конечно, нам не хватает очертаний материков, создадим их при помощи команды
Вот уже картинка, по которой можно ориентироваться с температурой в человеческих единицах измерения:
О функции GO надо сказать отдельно. При помощи неё запускаются скрипты ferret. Некоторые из них, такие как land, отрисовывающий очертания суши, доступны сразу и по умолчанию. Конечно, вы можете сами писать скрипты, расширение у них должно быть .jnl. Более того, после завершения ferret в той дирректории из которой вы его открыли, вы сможете найти .jnl файл, содержащий все команды, которые вы выполняли внутри ferret.
Давайте теперь на время оставим рисование и узнаем побольше о наших данных. Наша температура воздуха у поверхности расположена на сетке или гриде. То есть каждому значению температуры соответствует его широта, долгота, высота/глубина (в нашем случае постоянная — поверхность) и, наконец, время. Всё это и называется гридом, и чтобы посмотреть подробности о нём необходимо выполнить
GRID GGL1
name axis # pts start end
LON LONGITUDE 144mr 0E 2.5W
LAT LATITUDE 73 r 90S 90N
normal Z
TIME TIME 339 r 01-JAN-2008 00:00 04-DEC-2008 00:00
Так мы видим, что долготы идут от 0 до -2.5, широты от -90 до 90, а время от 1 января 2008 до 4 декабря. Если интересна даты выпавшие на номера с 45 по 55, можно написать:
GRID GGL1
name axis # pts start end
LON LONGITUDE 144mr 0E 2.5W
LAT LATITUDE 73 r 90S 90N
normal Z
TIME TIME 339 r 01-JAN-2008 00:00 04-DEC-2008 00:00
L T TBOX TBOXLO TSTEP (hours)
45> 14-FEB-2008 00:00:00 24 13-FEB-2008 12:00:00 17594088
46> 15-FEB-2008 00:00:00 24 14-FEB-2008 12:00:00 17594112
47> 16-FEB-2008 00:00:00 24 15-FEB-2008 12:00:00 17594136
48> 17-FEB-2008 00:00:00 24 16-FEB-2008 12:00:00 17594160
49> 18-FEB-2008 00:00:00 24 17-FEB-2008 12:00:00 17594184
50> 19-FEB-2008 00:00:00 24 18-FEB-2008 12:00:00 17594208
51> 20-FEB-2008 00:00:00 24 19-FEB-2008 12:00:00 17594232
52> 21-FEB-2008 00:00:00 24 20-FEB-2008 12:00:00 17594256
53> 22-FEB-2008 00:00:00 24 21-FEB-2008 12:00:00 17594280
54> 23-FEB-2008 00:00:00 24 22-FEB-2008 12:00:00 17594304
55> 24-FEB-2008 00:00:00 24 23-FEB-2008 12:00:00 17594328
и вам в подробностях всё расскажут.
Это может пригодиться когда, вы решите сделать временное осреднение. Для этого вам нужно просто написать за какой временной диапазон вы хотите осреднить и вуаля, у вас уже средняя температура, скажем за первые 30 дней:
yes? go land
Как вы уже наверное поняли, делается это при помощи оператора @AVE. Не правда ли очень лаконичная запись того, для чего на фортране вам пришлось бы писать отдельную программу. При этом я добавил изолиний.
Если вы обратите внимание на заголовок, то увидите, что тут Ferret не совсем хорошо справился со своими обязанностями, и надписи наложились друг на друга. Тем не менее можно понять, что то, что показано это среднее за первые числа 2008го (ну и вторую половину 31 декабря 2007 мы захватили).
Мы можем произвести и более сложную операцию — давайте сделаем среднее за всё время, которое у нас есть и вычтем его из среднего за первый месяц. При этом используем ещё один вариант отображения — залитые изолинии.
yes? go land
Без проблем. Видно, что в январе в северном полушарии было холоднее чем в среднем за год (правда исключая почти весь декабрь), а в южном теплее:
?ногда нам нужно посмотреть на несколько графиков одновременно, чтобы сравнить их друг с другом. Это достигается в ferret при помощи так называемых VIEWPORTS. В скрипте ниже продемонстрирована также возможность производить выборку не по индексам координат, а по их реальным значениям. Дело в том, что при помощи переменных I J K L можно обращаться к координате по её номеру, а X Y Z T по её реальным значениям. Это мы и используем при осреднении по времени:
let air_ave = airc[T=1-jan-2008:4-dec-2008@AVE]
set view UL
fill/LEVELS=(-35,35,2) airc[T=1-jan-2008:31-jan-2008@AVE] - air_ave
go land
set view UR
fill/LEVELS=(-35,35,2) airc[T=1-feb-2008:29-feb-2008@AVE] - air_ave
go land
set view LL
fill/LEVELS=(-35,35,2) airc[T=1-mar-2008:31-mar-2008@AVE] - air_ave
go land
set view LR
fill/LEVELS=(-35,35,2) airc[T=1-apr-2008:30-apr-2008@AVE] - air_ave
go land
Январь над территорией России был довольно холодным… При отрисовке картинки Ferret выбирает цветовую разбивку самостоятельно. Чтобы иметь возможность сравнивать картинки, нам, конечно, нужно их задать явно и сделать одинаковыми для всех карт. Параметры — минимум, максимум и шаг.
set view UL UR LL и LR определяют, что вывод будет производиться в верхний левый, верхний правый, нижний левый и нижний правый угол соответственно.
Если бы возможности Ferret ограничивались только отрисовкой площадных карт, то он не был бы таким интересным инструментом для анализа, но он может вольно обходиться с теми четырьмя измерениями, которыми располагает и позволяет быстро делать очень интересные вещи.
- Давайте снова создадим переменную, air_ave в которую поместим среднюю температуру за весь доступный нам период времени.
- Создадим ещё одну переменную, air_an которую определим как разность между airc и нашей средней температурой air_ave (это называется аномалия)
- Выберем для анализа долготу, при этом зададим её не индексом, а явно. То есть в нашем случае X=100 значит именно 100 градусов восточной долготы а не 100й элемент массива долгот.
- Выбираем для отрисовки широты от -70 до 70 (тоже в явном виде), все доступные нам дни (в принципе мы бы могли их опустить) и устанавливаем минимум, максимум и шаг легенды.
let air_an = airc - air_ave
CANCEL VIEWPORTS
SET REGION/X=180
FILL/Y=70S:70N/L=1:339/LEVELS=(-25,25,2) air_an
Этот скрипт для каждого дня и для широт между -70 и 70, на долготе 100, считает разницу между значениями в этот день и средним air_ave и отображает это дело на графике, где по абсциссе — время, а по ординате широты. Думаю, что даже я завтра не пойму смысл этого предложения, но в принципе ничего сложного тут нет, это аномалии температуры для долготы 100.
Результат:
Наглядная демонстрация того, о чём нам говорили в школе — в северном полушарии контраст между летом и зимой больше, плюс на данной долготе лето потеплее, а зима похолоднее опять же в северном полушарии.
Давайте это дело докажем ещё одним графиком
yes? LET NORTH = air_an[Y=20:70N@AVE]
yes? LET SOUTH = air_an[Y=70S:20S@AVE]
yes? PLOT/L=1:339 NORTH, SOUTH
- Установим отношение сторон 0.4 чтобы наш график был подлиннее
- Создадим переменную NORTH, в которой будет среднее всех аномалий между 20 и 70 градусами северной широты
- SOUTH — то же только для южных широт
- ? плотим это дело за каждый день, обе переменных на одном графике.
Результат:
Надеюсь что этими несложными, но наглядными, примерами я убедил вас, что Ferret по крайней мере стоит хотя бы попробовать )
Спасибо за подробнейшее описание!) У меня такой вопрос- возможно ли вручную менять подписи в Ferret? Например, сделать их на русском?
2Svetlana
Подписи менять возможно, для этого нужно обратиться к командам
PPL PLOT или PPL FILL
ну или изменить их в netCDF файле.
Насчёт русского не уверен к сожалению, никогда не пробовал.
Здравствуйте еще раз! У меня такой вопрос, не подскажете- как лучше и проще открыть в ferret бинарный файл, не конвертируя его прежде в netCDF?
Спасибо.
2Svetlana
Простого нет, есть относительно сложный )
Дело в том что в бинарнике нет никакой информации о содержании данных, поэтому феррет не знает как с ним быть. Вы должны эту информацию сообщить и уже потом открывать файл
define axis/x=-97:22:1/unit=degree xaxis
define axis/y=-30:65:1/unit=degree yaxis
define axis/t=24-feb-2000:31-dec-2006:1/unit=days taxis
define grid/x=xaxis/y=yaxis/t=taxis daily_aod_grid
file/var=AOD/grid=daily_aod_grid/ez/format=stream/type=r4 «/path/file_AOD.bin»
в этом примере вы сначала создаёте оси x,y,t , называя их xaxis yaxis taxis. Затем создаёте из этих осей грид под названием daily_aod_grid. Дальше создаёте переменную AOD с гридом daily_aod_grid .
Спасибо за пример Nidia Martinez.
Ещё можно взглянуть тут http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/data-set-basics/BINARY-DATA#_VPID_46
Здравствуйте))
хотела спросить, как посторить график вертикального распределения, например,температуры для Москвы. Т.е. по оси У- высота (или сигма-уровни), по оси х- значения температуры.
Я пыталась ТАК:
define axis/x=37.4:37.4:1/unit=degree xaxis
define axis/y=55.6:55.6:1/unit=degree yaxis
define axis/z=1:4:1/unit=sigma_level zaxis
define axis/t=01-feb-2009:01-feb-2009:1/unit=days taxis
define grid/x=xaxis/y=yaxis/z=zaxis/t=taxis daily_grid
file/var=p/grid=daily_grid/ez/format=stream/type=r4 «pressure_vert.bin»
show data
!set region/x=37.4/y=55.6
!contour/fill/z=1:4/l=1 p
plot/x=37.4/y=55.6/l=1 p[z=1:4@ave]
frame/file=sigma_pres.gif
Но не получается, точнее, выдает пустое окно. Если сталкивались- не подскажете?
Спасибо)))
2Svetlana
Помогло бы если б вы прислали файлик если это возможно. на koldunovn@gmail.com
Здравствуйте.
Столкнулся со следующей проблемой. Есть файлик в netCDF (http://85.159.44.237/wrf.nc) c сеткой по х и у 1:69. В нём присутствует достаточно большое количество переменных.
Рисуем:
shade/l=1 t2
go land
всё бы ничего, но это должна быть европейская часть России.. А Феррет считает координатами квадрат 1-69 в градусах
В исходном файле есть 2 массива, xlong и xlat. Можно ли как-нибудь без изменения .nc применить эти массивы, как если бы они были координатами?
В документации нашёл различные способы изменения сетки, но они касаются изменений масштаба и различных округлений.
заранее благодарю
2Felixoid
Отвечу и тут, чтоб не потерялось )
Вы пытаетесь, насколько я понимаю, отрисовать рисунок в криволинейных
координатах.
Как это сделать описано на этой странице документации
http://ferret.pmel.noaa.gov/Ferret/documentation/users-guide/working-with-special-data-sets/CURVILINEAR-COORDINATE-DATA?searchterm=curvi
В принципе вы должны просто использовать три переменных при использовании shade
shade/l=1 t2, xlat, xlong
У меня по вашим данным что то отрисовалось, но не знаю то ли это что
вы ожидаете )
Еще может помочь вот эта страничка
http://ferret.pmel.noaa.gov/HOMEPAGE/FAQ/custom_plots/subsetting_curvi_data.html
ну и поиск по документации по «curvilinear grid»
Здравствуйте,
пытаюсь загрузить в Ferret данные в Netcdf формате, но Ferret отказыаается их принять, разные файлы пробовала, результат один… только ваш файл из примера и получается загрузить…
yes? set data 1.nc
**TMAP ERR: non-existent or not on line
1.nc
подскажите, пожалуйста
Спасибо)))
2Светлана
Первое что приходит в голову это то что феррет у вас запущен не в той дирректории в которой вы сохранили файл.
А так, сложно сказать, дайте ссылки на файлы, попробую посмотреть 🙂
аналогичная ситуация, что и у Светланы.
Как я представляю: не важно где запущен ferrer, он все равно должен обращаться за данными в директорию, которая прописана в ferret_paths (она указыватся при установке и считается, что там хранятся данные по дефолту).
проверила все пути к данным, но у меня через раз выдается сообщение
**TMAP ERR: non-existent or not on line
nc файлы просматриваются корректно (например ncview)
может подскажите, что можно сделать?
Where Can I Order Levitra [url=http://apcialisle.com/#]Cialis[/url] Wirkung Von Viagra Wikipedia Buy Cialis Viagra Fa Bene
Viagra From Mexico Pharmacy [url=https://apcialisle.com/#]Cialis[/url] Wirkung Viagra Alkohol Cialis Erythromycin No Prescription
Photo Effet Viagra [url=https://apcialisle.com/#]viagra vs cialis[/url] Tipos De Viagra Natural cialis dosage Buy Valtrex Online With No Prescription
Viagra En Suisse Sans Ordonnance [url=https://apcialisle.com/#]Cialis[/url] Viagra Ersatz Nachnahme Cialis Viagra Lagerung