强制颜色条刻度为 min/max 值

Forcing colorbar ticks at min/max values

我正在使用 matplotlib 中的 contourf 函数进行绘图,并想添加一个颜色条,我注意到有时刻度不会达到 max/min 值。

是否有一种干净的方法来强制它在这些值上设置刻度?

注意:检查zmaxmin显示颜色条代表大约-1到1的值,因此我希望这个 ot 能够被反映出来,这样人们就可以看到 colobar 的范围,以及介于两者之间的一些刻度。

演示我在说什么的情节和代码

import matplotlib.pyplot as plt
import numpy as np

# Data to plot.
x, y = np.meshgrid(np.arange(7), np.arange(10))
z = np.sin(0.5 * x) * np.cos(0.52 * y)

fig, ax = plt.subplots()
cs = ax.contourf(x, y, z, levels=25)
ax.grid(c="k", ls="-", alpha=0.3)
fig.colorbar(cs, ax=ax)

fig.savefig("example.png", bbox_inches="tight")

最简洁的方法似乎是为 contourf 提供明确的级别。如果没有给出明确的级别,contourf 似乎会根据数据中的最小值和最大值选择自己的级别,并且还会尝试找到“好看”的数字。之后,刻度被设置为这些数字的子集,这样刻度总是与实际水平重合。 (如果您使用 colorbar(..., ticks=...),这些报价不一定与水平重合。)

由于正弦和余弦在给定示例中没有达到 -11,因此它们不在范围内。

以下代码显示刻度如何取决于所选级别。 np.linspace(-1, 1, 24) 级别不是很好的整数,但 matplotlib 仍然选择一个子集来显示。

import matplotlib.pyplot as plt
import numpy as np

x, y = np.meshgrid(np.arange(7), np.arange(10))
z = np.sin(0.5 * x) * np.cos(0.52 * y)

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 3))
for ax in (ax1, ax2):
    numcontours = 25 if ax == ax1 else 24
    cs = ax.contourf(x, y, z, levels=np.linspace(-1, 1, numcontours))
    ax.grid(c="k", ls="-", alpha=0.3)
    fig.colorbar(cs, ax=ax)
    ax.set_title(f'{numcontours} levels from -1 to 1')
plt.show()