多个图像共用一个颜色条#

为多个图像使用一个单独的颜色条。

目前,一个颜色条只能连接到一个图像。这种连接保证了数据着色与颜色映射尺度保持一致(即颜色映射中值 x 的颜色用于图像中数据值 x 的着色)。

如果我们希望一个颜色条能代表多个图像,我们必须通过对所有图像使用相同的数据归一化来明确确保数据着色的一致性。我们通过显式创建一个 norm 对象并将其传递给所有图像绘图方法来实现这一点。

import matplotlib.pyplot as plt
import numpy as np

from matplotlib import colors

np.random.seed(19680801)

datasets = [
    (i+1)/10 * np.random.rand(10, 20)
    for i in range(4)
]

fig, axs = plt.subplots(2, 2)
fig.suptitle('Multiple images')

# create a single norm to be shared across all images
norm = colors.Normalize(vmin=np.min(datasets), vmax=np.max(datasets))

images = []
for ax, data in zip(axs.flat, datasets):
    images.append(ax.imshow(data, norm=norm))

fig.colorbar(images[0], ax=axs, orientation='horizontal', fraction=.1)

plt.show()
Multiple images

当改变缩放比例时(例如通过在颜色条中缩放或通过Qt后端中“编辑轴、曲线和图像参数”GUI),颜色现在在所有图像中保持一致。这对于大多数实际用例来说已足够。

高级:额外同步颜色映射#

共享一个公共的 norm 对象可保证同步缩放,因为缩放更改会就地修改 norm 对象,从而传播到所有使用此 norm 的图像。这种方法无助于同步颜色映射,因为更改图像的颜色映射(例如通过Qt后端中“编辑轴、曲线和图像参数”GUI)会导致图像引用新的颜色映射对象。因此,其他图像不会更新。

要更新其他图像,请使用以下代码同步颜色映射

def sync_cmaps(changed_image):
    for im in images:
        if changed_image.get_cmap() != im.get_cmap():
            im.set_cmap(changed_image.get_cmap())

for im in images:
    im.callbacks.connect('changed', sync_cmaps)

脚本总运行时间: (0 分 1.012 秒)

由 Sphinx-Gallery 生成的画廊