设置颜色条以显示 matplotlib 中数据范围之外的值

Setting colorbar to show values outside of data range in matplotlib

我正在尝试创建一个图形,其中颜色条将超出数据范围(高于数据的最大值)。最终目的是我需要绘制模型输出的一系列图像(随着时间的推移),每个小时都存储在一个单独的文件中。我希望所有图形的颜色条都相同,以便可以将它们连接到动画中。

这是一个示例脚本:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 360, 1.5)
y = np.arange(-90, 90, 1.5)
lon, lat = np.meshgrid(x, y)
noise = np.random.random(lon.shape) # values in range [0, 1)

fig = plt.figure()
ax = fig.add_subplot(111)
plt.hold(True)
plt.contourf(lon, lat, noise)
plt.colorbar()

这会产生下图:

我一直在尝试使用我在网上找到的两种方法将颜色条的限制设置为数据范围之外的值(例如,从 -1. 到 2.):

在绘图线内设置 vmin=-1 和 vmax=2:

fig = plt.figure()
ax = fig.add_subplot(111)
plt.hold(True)
plt.contourf(lon, lat, noise, vmin=-1., vmax=2.)
plt.colorbar()

这似乎只改变了显示的颜色,因此颜色图中的第一种颜色对应于 -1,最后一种颜色对应于 2,但它不会扩展颜色栏以显示这些值(左图 link 下面)。

另一个是尝试强制颜色栏中的刻度扩展到该范围:

fig = plt.figure()
ax = fig.add_subplot(111)
plt.hold(True)
plt.contourf(lon, lat, noise)
plt.colorbar(ticks=np.arange(-1,2.1, .2))

这会产生定义的刻度位置,但仅限于有数据的范围,即颜色条仍然没有从 -1 扩展到 2(下面 link 中的中间图)。

有谁知道我如何让它做我想做的事?像这个 link 的右图:http://orca.rsmas.miami.edu/~ajdas1/SOF/n.html

对于大多数 2D 绘图函数(例如 imshowpcolor 等)设置 vminvmax 即可。但是,contourf(以及 contour)在映射颜色时将您要求它绘制轮廓的 levels 考虑在内:

如果您未指定 levels 参数,则该函数会自动生成从数据的最小值到最大值的 10 个等距水平。因此,要实现您想要的(不同输入数据的一致性),您必须明确指定级别:

import matplotlib.pyplot as plt
import numpy as np

# generate data
x = np.arange(0, 360, 1.5)
y = np.arange(-90, 90, 1.5)
lon, lat = np.meshgrid(x, y)
noise = np.random.random(lon.shape) 

# specify levels from vmim to vmax
levels = np.arange(-1, 2.1, 0.2)

# plot
fig = plt.figure()
ax = fig.add_subplot(111)
plt.contourf(lon, lat, noise, levels=levels)
plt.colorbar(ticks=levels)
plt.show()

结果:

给出了一个很好的例子来解决这个问题。

如果一系列图像的颜色条共享相同的 ScalarMappable 实例,而不是相应的 ContourSet 实例,则可以完成这些操作由每个 plt.contourf() 创建。 https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.colorbar

中有更多详细信息

我们可以这样解决问题:

import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)
m0=ax.contourf(lon, lat, noise, vmin=-1., vmax=2.)
m = plt.cm.ScalarMappable(cmap=cm.coolwarm)
m.set_clim(-1, 2)
fig.colorbar(m,ax=ax)

而不是使用 m0 (由 contourf 创建的 QuadContourSet 实例),我们在 fig.colorbar 中使用 m (ScalarMappable 实例) (),因为colorbar是用来描述可映射参数的。 https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.colorbar

m.set_clim 中的

clim 应匹配 contourf 中的 vmin/vmax。