我有一个子图的数组,我想通过后处理步骤共享一个彩条。当绘制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()
我最终通过使用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))