get_extent не возвращает обновленный экстент после того, как set_aspect установлен равным в Cartopy - PullRequest
0 голосов
/ 19 сентября 2019

При установке set_aspect('equal', adjustable='datalim') фактический экстент моего графика корректируется и немного шире, чем экстент, который я изначально установил - что и ожидается.
Однако, когда я пытаюсь получить эти скорректированные границы, get_extent()возвращает только то, что я ввел с set_extent().

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cpf
import shapely.geometry as sgeom

EXT = (9000000, 13500000, -450000, 3500000)

def to_bounds(extent):
    xmin, a, b, ymax = extent
    return xmin, b, a, ymax

platecarree = ccrs.PlateCarree(globe=ccrs.Globe(datum='WGS84', ellipse='WGS84'))

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1, projection=platecarree)

ax.set_extent(EXT, crs=platecarree) # setting extent
ax.set_aspect('equal', adjustable='datalim', anchor='C')
ext2 = ax.get_extent() # trying to get the updated extent

ax.add_feature(cpf.LAND, facecolor='#bababa')
ax.add_feature(cpf.BORDERS, edgecolor='white')
ax.add_geometries([sgeom.box(*to_bounds(EXT))], crs=platecarree, facecolor='none', edgecolor='yellow', linewidth=3)     # initial extent
ax.add_geometries([sgeom.box(*to_bounds(ext2))], crs=platecarree, facecolor='none', edgecolor='indianred', linewidth=1) # updated extent

enter image description here

Obvioulsy, EXT и ext2 одинаковы.
Самое странное то, что после запуска вышеуказанного кода, get_extent() фактически даст мне обновленные значения.

ext2 # (9000000.0, 13499999.999999998, -449999.99999999994, 3500000.0)

ax.get_extent() # (8546909.492273731, 13953090.507726269, -449999.99999999994, 3500000.0)

Что не так?

1 Ответ

0 голосов
/ 28 сентября 2019

Ничего плохого в том, что вы нашли.Когда вы устанавливаете экстент, вы объявляете значения, связанные с экстентом, который вы хотите построить, и они еще не применяются, пока карта не будет обработана и обработана.Поэтому, когда вы запрашиваете текущий экстент (с помощью ax.get_extent ()), вы не получаете значения, которые вы только что установили.Чтобы получить то, что вы ожидаете, вы должны запустить plt.draw().Вот модифицированный код и выходные данные, которые описывают процесс:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cpf
import shapely.geometry as sgeom

EXT = (9000000, 13500000, -450000, 3500000)

def to_bounds(extent):
    xmin, a, b, ymax = extent
    return xmin, b, a, ymax

platecarree = ccrs.PlateCarree(globe=ccrs.Globe(datum='WGS84', ellipse='WGS84'))

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1, projection=platecarree)

ax.set_extent(EXT, crs=platecarree) # setting extent
print("1. ax.set_extent(EXT..):", ax.get_extent())  # after EXT is used

ax.set_aspect('equal', adjustable='datalim', anchor='C')  # the extent changes at this step

ext2 = ax.get_extent()    # trying to get the updated extent; fails here!
print("2. ext2:", ext2 )  # print check; extent is not updated yet!

plt.draw()  # this updates the extent
print("3. ax.get_extent():", ax.get_extent())  # expected to have other values; OK now

ax.add_feature(cpf.LAND, facecolor='#bababa')
ax.add_feature(cpf.BORDERS, edgecolor='white')
ax.add_geometries([sgeom.box(*to_bounds(EXT))], crs=platecarree, facecolor='none', edgecolor='yellow', linewidth=4)     # initial extent
ax.add_geometries([sgeom.box(*to_bounds(ax.get_extent()))], crs=platecarree, facecolor='none', edgecolor='indianred', linewidth=5) # updated extent

plt.show()

Вывод:

enter image description here

...