设置颜色条以在 matplotlib 中显示超出数据范围的值

asa*_*sav 5 python matplotlib colorbar

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

这是一个示例脚本:

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()
Run Code Online (Sandbox Code Playgroud)

这会产生下图:

在此处输入图片说明

我一直在尝试使用我在网上找到的两种方法将颜色条的限制设置为数据范围之外的值(例如,从 -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()
Run Code Online (Sandbox Code Playgroud)

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

另一种是尝试在颜色栏中强制执行刻度以扩展到该范围:

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))
Run Code Online (Sandbox Code Playgroud)

这导致定义的刻度位置,但仅适用于有数据的范围,即颜色条仍然没有从 -1 扩展到 2(下面链接中的中间图)。

有谁知道我将如何让它做我想做的事?类似于此链接中的右图:http : //orca.rsmas.miami.edu/~ajdas1/SOF/n.html

hit*_*tzg 3

对于大多数 2D 绘图功能(例如imshowpcolor等)设置vminvmax完成工作。但是,contourf(也contourlevels在映射颜色时考虑您要求它绘制轮廓的时间:

如果您不指定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()
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述