从Cartopy GeoAxesSubplot对象中获取和设置最大值和最小值。

问题描述 投票:0回答:1

我有一个子图的数组,我想通过后处理步骤共享一个彩条。当绘制1-d数据时,我可以通过在创建数据和使用get_ylims()和set_ylims()找到后迭代轴,然后设置正确的全局最小值和最大值来实现这一点。

然而,当使用Cartopy GeoAxesSubplot对象时,我一直无法找到检索或设置z轴限制的函数。现在函数get_ylims对应的是绘图而不是数据。

我试图避免事先计算vmin和vmax的额外步骤,因为每个子图的处理需要相当长的时间,我不想做两次。我更愿意在后处理步骤中调整地理坐标。

简单地说,如果只给我第一个图,我如何从第一个图到第二个图?

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()
python cartopy
1个回答
0
投票

我最终通过使用matplotlib.collection.QuadMesh对象的get_clim()和set_clim()函数来解决这个问题。

我对轴进行迭代,然后使用get_children()对组件进行迭代。当我确定一个QuadMesh对象时,我将其保存到一个列表中。最后,我对该列表迭代两次,首先计算全局的最小值和最大值,然后将每个子图设置为这些值。

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))
© www.soinside.com 2019 - 2024. All rights reserved.