Как обеспечить отображение функций cartopy после установки аспекта поля осей matplotlib?Python

Программы на Python
Ответить
Anonymous
 Как обеспечить отображение функций cartopy после установки аспекта поля осей matplotlib?

Сообщение Anonymous »

У меня есть функция, которая создает карту при наличии DataFrame, содержащего координаты широты и долготы. Независимо от формы трека, который можно нарисовать из пар координат и временных меток, я хочу, чтобы соотношение сторон поля осей оставалось неизменным, используя axes.set_box_aspect(). Ниже приведен пример кода, используемого для рендеринга карты:

Код: Выделить всё

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plot
import pandas as pd

MAP_FIXED_WIDTH = 8
MAP_FIXED_HEIGHT = 6

df = pd.DataFrame(
{
"timestamp":
[
pd.Timestamp('2025-01-01 00:00:00 UTC'),
pd.Timestamp('2025-01-01 00:30:00 UTC'),
pd.Timestamp('2025-01-01 01:00:00 UTC'),
pd.Timestamp('2025-01-01 01:30:00 UTC'),
pd.Timestamp('2025-01-01 02:00:00 UTC'),
],
"latitude": [20,22,24,26,28],
"longitude": [-45,-40,-35,-30,-25],
},
)

def create_map_with_scatter_points(df: pd.DataFrame) -> None:
plot.figure(figsize=(MAP_FIXED_WIDTH, MAP_FIXED_HEIGHT))
axes = plot.axes(
projection=ccrs.PlateCarree(central_longitude=df["longitude"].median())
)

axes.set_box_aspect(MAP_FIXED_HEIGHT / MAP_FIXED_WIDTH)

axes.scatter(df["longitude"], df["latitude"], color='green')

axes.set_facecolor(cfeature.COLORS["water"])
axes.add_feature(cfeature.LAND, color="lightgray")
axes.add_feature(cfeature.LAKES)
axes.add_feature(cfeature.RIVERS)
axes.add_feature(cfeature.COASTLINE)
axes.add_feature(cfeature.BORDERS, linestyle=":")

axes.gridlines(
draw_labels=True, linewidth=1, color="gray", alpha=0.5, linestyle="--"
)

plot.show()

create_map_with_scatter_points(df)
Версии зависимостей:

Код: Выделить всё

matplotlib==3.10.7

Код: Выделить всё

pandas==2.3.3

Код: Выделить всё

cartopy==0.25.0
Однако я узнал, что set_box_aspect контролирует только физические размеры поля осей и не влияет на пределы данных внутри осей. В конечном итоге происходит то, что функции cartopy, существующие только за пределами диапазона предоставленных данных, не отображаются. В приложенном ниже выводе вы увидите, что границы вокруг островов Ямайка и Пуэрто-Рико не включены в карту именно потому, что они выходят за пределы x/y данных:

Изображение

К сожалению, используя axes.set_aspect(aspect='equal', регулируемый='datalim') также возвращает тот же результат, поскольку set_adjustable игнорирует явные ограничения данных.
В идеале мне бы хотелось избежать необходимости вручную создавать логику для обеспечения соотношения сторон поля через axes.set_extent, особенно из-за того, насколько сложно может быть обеспечить правильное использование правильной центральной долготы для карт, где данные пересекают 180-й меридиан и долгота переключаются между +/- 180.
Кто-нибудь еще сталкивался с этой проблемой при создании карт с помощью matplotlib и cartopy, и есть ли какие-либо обходные пути, которые вы нашли?

Подробнее здесь: https://stackoverflow.com/questions/798 ... xes-box-as
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»