Получение и установка максимальных и минимальных значений из объекта Cartopy GeoAxesSubplot - PullRequest
0 голосов
/ 17 июня 2020

У меня есть массив подзаголовков, которые я хотел бы показать на этапе постобработки. При построении одномерных данных я могу сделать это, перебирая оси после создания данных и используя методы get_ylims () и set_ylims () для поиска, а затем устанавливая правильные глобальные минимальное и максимальное значения.

Когда Однако работая с объектами Cartopy GeoAxesSubplot, мне не удалось найти функции для извлечения или установки пределов оси z. Теперь функция get_ylims соответствует графику, а не данным. люблю делать это дважды. Я бы предпочел настроить геооси на этапе постобработки.

Просто, как мне перейти от первой цифры ко второй, если мне дана только первая цифра?

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

# Create random data
data=[]
for i in range(4):
    data.append(i + np.random.random((10,10)))

# Plot with individual colorbars
fig,ax = plt.subplots(nrows=2, ncols=2, subplot_kw={'projection':ccrs.NorthPolarStereo()})
for _ax,_dat in zip(ax.flat,data):
    im = _ax.imshow(_dat)
    plt.colorbar(im,ax=_ax)

fig.suptitle('Before.')
plt.show()

# Plot with a shared colorbar
fig2,ax2 = plt.subplots(nrows=2, ncols=2, subplot_kw={'projection':ccrs.NorthPolarStereo()})
for _ax,_dat in zip(ax2.flat,data):
    im = _ax.imshow(_dat, vmin=0, vmax=4)

fig2.colorbar(im, ax=ax2.ravel().tolist())
fig2.suptitle('After.')
plt.show()

1 Ответ

0 голосов
/ 18 июня 2020

В конце концов я решил это, используя функции get_clim () и set_clim () объекта matplotlib.collections.QuadMe sh.

Я перебираю оси, а затем перебираю компоненты, используя get_children (). Когда я идентифицирую объект QuadMe sh, я сохраняю его в списке. Наконец, я дважды перебираю этот список, сначала для вычисления глобальных минимальных и максимальных значений, а затем для установки этих значений на каждом подзаголовке.

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy as cpy
import matplotlib as mpl

geoaxes = figure.axes 

qms = [] # to store QuadMesh object
for i in geoaxes: # iterate over axes and find QuadMesh objects
    for j in i.get_children(): # breaks down a single axis (?) into components
        if isinstance(j, mpl.collections.QuadMesh):
            qms.append(j)

# Calculate global min and max values
min,max = qms[0].get_clim() # initialize min/max

for _qm in qms:
    _clim = _qm.get_clim()
    if _clim[0] < min:
        min = _clim[0]
    if _clim[1] > max:
        max = _clim[1]
    print(_clim)

# Set common bounds for each QuadMesh:
for _qm in qms:
    _qm.set_clim((min, max))
...