Использование python Basemap.pcolormesh с немонотонными скачками долготы

#python #matplotlib-basemap

#python #matplotlib-базовая карта

Вопрос:

У меня есть данные спутниковой развертки, которые я пытаюсь отобразить на базовой карте с помощью pcolormesh.

Данные организованы в виде 2d-матрицы (bTemp) с двумя соответствующими 2D-массивами lat и lon, которые дают соответствующую широту и долготу в каждой точке. Итак, мой код построения выглядит так

 m = Basemap()
m.drawcoastlines()
m.pcolormesh(lon, lat, bTemp)
  

Однако это не совсем дает мне результат, который я ищу. По карте проходит большая полоса.
введите описание изображения здесь

Я думаю, что причиной этого является то, что моя долгота увеличивается немонотонно вдоль заданного луча в точке обтекания.

Вот график on ray в моем массиве долгот

 plot(lon[100,:])
  

введите описание изображения здесь

Каков наилучший способ исправить это, чтобы график pcolormesh просто переходил на другую сторону карты, не соединяя две точки с заполненной областью?

Ответ №1:

Вы могли бы попробовать использовать numpy.unwrap для разворачивания ваших данных. Он был разработан именно для этого: разворачивать угловые скачки (в радианах), которые являются артефактами из-за того, как мы используем однозначные функции.

Чтобы это сработало, вам нужно преобразовать ваши долготы туда и обратно между градусами и радианами, но суть в следующем:

 import numpy as np
lon_unwrapped = np.rad2deg(np.unwrap(np.deg2rad(lon)))
  

Это позволит найти те скачки в ваших данных, которые больше 180 градусов, и дополнить их на 360 градусов. Пример:

 np.rad2deg(np.unwrap(np.deg2rad([150,-150])))
# array([ 150.,  210.])
  

Кроме того, unwrap принимает данные ndarray, и вы можете указать, по каким осям выполнять распутывание. По умолчанию это последнее измерение, которое, кажется, подходит для вашего случая, когда вы хотите развернуть lon[i,:] .

Комментарии:

1. Это не совсем дает желаемый результат. Вместо того, чтобы в итоге получить плавное увеличение с -180 до 180, оно просто добавляет 360 к моим числам после перехода. Итак, я получаю плавное увеличение, но оно составляет от ~ 90 до ~ 240 градусов …. по сути, как будто вы взяли участок моего линейного графика выше после перехода и просто подняли его, чтобы он соответствовал остальной части строки. Итак, я получаю значения долготы> 180, которые базовая карта просто не отображает.

2. @user3826115 да, это то, что он должен делать. Все разумные представления углов на сфере должны просто правильно обтекаться, я не знал, что базовая карта этого не делает:/ В этом случае у вас нет другого шанса, кроме как циклически изменять порядок ваших данных. Опция грубой силы: ind = np.where(np.diff(lon[i,:])<0)[0] 1; lon[i,:] = np.concatenate((lon[i,ind:],lon[i,:ind])) , циклическая перестановка. Вы также можете попробовать, что addcyclic делает, это может быть то, что вам нужно после использования unwrap, я не нашел документы понятными.