#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, я не нашел документы понятными.