使用 matplotlib 指示多个子图的数据范围的颜色条?

One colorbar to indicate data range for multiple subplots using matplotlib?

类似的问题我看过很多this one。然而,颜色条实际上表示最后一个子图的数据范围,如下代码验证:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)


fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
    ax = axs[row]
    if row == 0:
        pcm = ax.pcolormesh(np.random.random((20, 20)) * (-100),
                            cmap=cmaps[0])
    elif row == 1:
            pcm = ax.pcolormesh(np.random.random((20, 20)) * 100,
                            cmap=cmaps[0])
fig.colorbar(pcm, ax=axs)
plt.show()

colobar只表示第二个子图的数据范围。第一个子图中的数据实际上是负数,颜色栏中没有显示。

fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
    ax = axs[row]
    if row == 0:
        pcm = ax.pcolormesh(np.random.random((20, 20)) * (-100),
                            cmap=cmaps[0])
    elif row == 1:
            pcm = ax.pcolormesh(np.random.random((20, 20)) * 100,
                            cmap=cmaps[0])
    fig.colorbar(pcm, ax=ax)
plt.show()

那么如何让多个子图共享一个颜色条来指示整体数据范围?

问题可能是fig.colorbar(pcm, ax=axs)引起的,其中pcm指向第二个子图,但我不知道如何解决这个问题。

将颜色限制设置为相同...

import matplotlib.pyplot as plt 
import numpy as np 

fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
    ax = axs[row]
    mult = -100 if row == 0 else 100
    pcm = ax.pcolormesh(np.random.random((20, 20)) * mult,
                            cmap=cmaps[0], vmin=-150, vmax=150)
fig.colorbar(pcm, ax=axs)
plt.show()

或者等效地,您可以指定一个 Normalize 对象:

import matplotlib.pyplot as plt 
import numpy as np 


fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
norm = plt.Normalize(vmin=-150, vmax=150)
for row in range(2):
    ax = axs[row]
    mult = -100 if row == 0 else 100
    pcm = ax.pcolormesh(np.random.random((20, 20)) * mult,
                            cmap=cmaps[0], norm=norm)
fig.colorbar(pcm, ax=axs)
plt.show()