Cartopy: невозможно построить векторное поле с неопределенностью (и связанными с этим вопросами) - PullRequest
2 голосов
/ 14 марта 2020

Я уже некоторое время пытаюсь построить векторное поле с эллипсами неопределенности в Cartopy. Идея состоит в том, что если у меня есть местоположение (широта / долгота) и вектор (например, скорость ветра), но этот вектор имеет неопределенность (измеренную, например, в стандартном отклонении), то я бы хотел построить эллипсы вокруг кончика стрелки, указывающей на эту неопределенность. В GMT psvelo добивается цели, моя цель - примерно так .

Это тот же вопрос, который был задан ранее здесь - я открывая его снова, потому что я думаю, что если кто-то может помочь мне лучше понять преобразования, и я смогу найти расположение кончика стрелки, я сам смогу построить эллипс ошибки. Кроме того, некоторые функции Matplotlib / Cartopy могли измениться за последние 4 года.

Итак, вот что я попробовал:

  1. Создание карты с использованием колчана для построить векторы, а затем попытаться получить доступ к какому-либо параметру масштаба в возвращенном объекте Quiver. Я не смог найти ничего полезного, и хотя атрибут scale выглядел так, как будто это было бы правильно, оказалось, что он никогда не будет установлен, если я сам его не установлю.

  2. Если я сам установлю масштабирование, я не знаю, как это сделать, если мое местоположение и вектор имеют разные единицы измерения, и оба, очевидно, не связаны с шириной оси. Например, если я решил, что хочу иметь вектор длиной 50 м / с при 10 ° E, 40 ° N, равный определенной части ширины оси, каким будет мой параметр scale? Испытание случайных комбинаций преобразований не дало никаких результатов. (Идея здесь в том, что если я смогу выяснить это отношение, то я на шаг ближе к знанию, куда поместить эллипс.)

  3. Я пытался выяснить quiver автоматически масштабируется, чтобы увидеть, как я могу «предсказать», что он собирается делать внутри, а затем использовать это, чтобы узнать, где находится наконечник стрелки. К сожалению, это не так просто, как вариант Matlab , поэтому я тоже потерпел неудачу.

  4. Наконец, я также не понимаю, почему я не могу используйте cartopy.crs.Geodetic() в качестве моей исходной системы координат. Ошибка, которую я получаю: invalid transform: Spherical quiver is not supported - consider using PlateCarree/RotatedPole. Из прочтения документации Cartopy, разве это не подходит, если местоположение моего вектора измеряется по широте, долготе и высоте?

Вот MWE :

# imports
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# data
lon, lat = np.array([10, 10.5]), np.array([40, 40])
east, north = np.array([0, 50]), np.array([50, 0])
# map
fig, ax = plt.subplots(subplot_kw={"projection": ccrs.Mercator()})
ax.set_extent([7, 13, 38, 42], ccrs.Geodetic())
ax.coastlines("50m")
q = ax.quiver(lon, lat, east, north, transform=ccrs.PlateCarree())
plt.show()

Я действительно считаю, что это особенность, которую должна иметь Cartopy, так как это одно из самых больших препятствий, с которыми я столкнулся при использовании Python для геонаучных приложений. В настоящее время единственный известный мне подход - это написать файл сценария GMT из моей Python программы и запустить GMT с системным вызовом Python, и это действительно очень неприятно.

Я знаю, что GMT разрабатывает свой собственный Python интерфейс , но они даже не вобрали в себя все основные функции c, поэтому никто не догадывается, когда они доберутся до psvelo ...

Спасибо за вашу помощь и советы,

PBB

1 Ответ

1 голос
/ 18 марта 2020

Ну, самая сложная часть об этом - часть matplotlib. Если бы я пытался сделать это, я бы сосредоточился на этом, прежде чем заставить его работать в Cartopy. Технически, точка, которая вам нужна, находится где-то в наборе путей, сгенерированных командой quiver (находится в q._paths в вашем MWE). Более простым решением было бы использовать pivot='tip', чтобы точка стрелки всегда находилась в точке (x,y).

Ошибка, которую вы получаете от Cartopy при попытке использовать Geodetic, потому что все правильно при работе над сферой требует более сложной математики - поэтому не все работает с Geodetic. Если вместо этого вы используете PlateCarree, он будет считать lon / lat декартовыми координатами на плоскости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...