如何在 matplotlib 中用白色替换代表两个最小值的颜色图的颜色?

How to replace colors of a colormap respresenting the two smallest values by white in matplolib?

我正在 matplotlib 中绘制一个动画 contourf 地图,其中的颜色条在每一帧都发生变化。我想让颜色条保持在零的中心(我使用的是发散颜色图),为此我使用了奇数个级别。问题是,当我这样做时,即使颜色图 (cm.seismic) 的中心颜色是白色,这种颜色也不会出现在颜色图中。我希望能够用白色替换最小值(浅红色和浅蓝色)的颜色,这样我就有两个(两个最小值),而不是一个颜色为白色(零)的中央层。

您可以提供颜色列表,而不是提供颜色图。可以根据给定的颜色图计算该列表,中间的颜色可以明确设置为白色。

这是一个例子:

import matplotlib.pyplot as plt
import numpy as np

x = y = np.linspace(-3.0, 3.01, 100)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X ** 2 - Y ** 2)
Z2 = np.exp(-(X - 1) ** 2 - (Y - 1) ** 2)
Z = (Z1 - Z2) * 2

num_levels = 9
colors = plt.cm.seismic(np.linspace(0, 1, num_levels + 1))
colors[num_levels // 2] = [1, 1, 1, 1] # set to white
colors[num_levels // 2 + 1] = [1, 1, 1, 1]

fig, ax1 = plt.subplots(figsize=(10, 5))
CS = ax1.contourf(X, Y, Z, num_levels, colors=colors, origin='lower')
cbar = fig.colorbar(CS, ax=ax1)
plt.show()