用一个颜色条替换子图颜色条

Replacing subplot colorbars with one colorbar

我正在尝试创建一个包含 6 个子图的图形,所有子图都具有相同的颜色条。我可以将所有内容绘制在一起,但 python 会自动为每个图添加一个颜色条。因此,当我尝试创建和添加另一个跨越图形长度的颜色条时,它仍然具有所有 6 个原始颜色条以及新创建的颜色条。我怎样才能创建一个颜色条来跨越所有 6 plots/entire 个图形的长度,并且仍然 delete/remove 每个子图的单个颜色条?

这是我的代码和示例输出(此时中间的两个图应该是空的):

fig, axs = plot.subplots(ncols=2, nrows=3, axwidth=5, proj='pcarree')
ax1, ax2, ax3, ax4, ax5, ax6 = axs
axs.format(suptitle=('MAM S06 Change in (m/s)'), 
       coast = True,latlim = (20,50), lonlim = (235,293), innerborders = True)
S06_mam_seas_1.plot.contourf(ax=ax1, levels = levels)
S06_mam_seas_2.plot.contourf(ax=ax2, levels = levels)
S06_mam_seas_3.plot.contourf(ax=ax3, levels = levels)
S06_mam_seas_4.plot.contourf(ax=ax4, levels = levels)
S06_mam_seas_5.plot.contourf(ax=ax5, levels = levels)
S06_mam_seas_6.plot.contourf(ax=ax6, levels = levels)
ax1.set_title(str(Diff1) + ' - ' + str(BASE))
ax2.set_title(str(Diff2) + ' - ' + str(BASE))
ax3.set_title(str(Diff3) + ' - ' + str(BASE))
ax4.set_title(str(Diff4) + ' - ' + str(BASE))
ax5.set_title(str(Diff5) + ' - ' + str(BASE))
ax6.set_title(str(Diff6) + ' - ' + str(BASE))

我的图像输出

以下是我尝试创建和添加自己的轴时发生的情况:

谢谢!!

对我来说,这看起来像 xarray 的 faceting 绘图功能是一个不错的选择。 您首先必须沿着一个新的维度连接您的数据数组,这将是时间段。

import numpy as np
import pandas as pd
import xarray as xr

# Create a dummy representation of your data
S06_mam_seas_1 = xr.DataArray(
    name="s06_change", dims=("lat", "lon"), data=np.random.rand(100, 100)
)
S06_mam_seas_2 = xr.DataArray(
    name="s06_change", dims=("lat", "lon"), data=np.random.rand(100, 100)
)
S06_mam_seas_3 = xr.DataArray(
    name="s06_change", dims=("lat", "lon"), data=np.random.rand(100, 100)
)
S06_mam_seas_4 = xr.DataArray(
    name="s06_change", dims=("lat", "lon"), data=np.random.rand(100, 100)
)
S06_mam_seas_5 = xr.DataArray(
    name="s06_change", dims=("lat", "lon"), data=np.random.rand(100, 100)
)
S06_mam_seas_6 = xr.DataArray(
    name="s06_change", dims=("lat", "lon"), data=np.random.rand(100, 100)
)

# Concatenate the dataarrays along a new dimension
start_years = [1881, 1911, 1941, 2021, 2041, 2071]
end_years = [1910, 1940, 1970, 2050, 2070, 2100]
period = [f"{start} – {end}" for start, end in zip(start_years, end_years)]
S06_mam_seas = xr.concat(
    [
        S06_mam_seas_1,
        S06_mam_seas_2,
        S06_mam_seas_3,
        S06_mam_seas_4,
        S06_mam_seas_5,
        S06_mam_seas_6,
    ],
    dim=pd.Index(period, name="time_period"),
)
# Set some metadata
S06_mam_seas.attrs["long_name"] = "MAM S06 Change"
S06_mam_seas.attrs["units"] = "m/s"

那么,绘图就变得超级简单了:

levels = np.arange(0, 1, 0.1)
g = S06_mam_seas.plot.contourf(col="time_period", col_wrap=2, levels=levels)
g.set_titles(template="({value}) - (1971 – 2000)")

我没有绘制地图的经验,因此您需要对设置投影等代码进行一些调整。但是在xarray documentation中,有一个在地图上进行分面的示例。

首先,通过将初始绘图线之一设置为变量,比如 a,然后我们可以使用该绘图中的信息来创建我们的颜色条。

接下来,确保每条绘图线都有参数,add_colorbar = False。现在,您已经关闭了所有图的颜色条,可以继续创建您自己的图了。

最后,我们可以创建一个颜色条,它将添加到整个图中,而不是每个单独的图中。我们可以通过引用我们制作并称为 a 的第一个图来做到这一点。现在,例如,要用一个颜色条绘制前 4 行代码,代码为:

fig, axs = plot.subplots(ncols=2, nrows=3, 
axwidth=5, proj='pcarree')
ax1, ax2, ax3, ax4, ax5, ax6 = axs
a = S06_mam_seas_1.plot.contourf(ax=ax1,  add_colorbar = False,levels = levels)
S06_mam_seas_2.plot.contourf(ax=ax2, add_colorbar = False,levels = levels)
S06_mam_seas_3.plot.contourf(ax=ax3, add_colorbar = False, levels = levels)
S06_mam_seas_4.plot.contourf(ax=ax4, add_colorbar = False, levels = levels)
S06_mam_seas_5.plot.contourf(ax=ax5, add_colorbar = False, levels = levels)
S06_mam_seas_6.plot.contourf(ax=ax6, add_colorbar = False, levels = levels)


cbar = fig.colorbar(a,  loc="bottom", cmap = cmap, labelsize= 22, label = units, shrink = 1)

此图是使用此技术绘制的: