具有一个颜色条的多个图像#

为多个图像使用单个颜色条.

目前,一个颜色条只能连接到一个图像.这种连接保证了数据的着色与颜色映射刻度一致(即颜色映射中值 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)

参考

以下函数,方法,类和模块的用法在本例中显示:

  • matplotlib.axes.Axes.imshow / matplotlib.pyplot.imshow

  • matplotlib.figure.Figure.colorbar / matplotlib.pyplot.colorbar

  • matplotlib.colors.Normalize

  • matplotlib.cm.ScalarMappable.set_cmap

  • matplotlib.cbook.CallbackRegistry.connect

Gallery generated by Sphinx-Gallery