Colorbar 刻度标签与刻度位置不匹配

Colorbar ticklabels don't match tick positions

我正在用 pyplot.pcolormesh 绘制网格,我想自定义颜色栏上的刻度标签。我设置了一个刻度位置列表,并提供了一个刻度标签列表,它应该与刻度位置相匹配,但我不知道提前实际包含哪些刻度,因为我不知道的最大值和最小值数据。问题是我提供的第一个刻度标签总是用在第一个可见的刻度上,不管它是否是我列表中的第一个刻度。

工作示例:

import matplotlib.pyplot as plt  
import numpy as np

a = np.arange(1,10).reshape(3,3)
m = plt.pcolormesh(a)
c = plt.colorbar(m)
c.set_ticks(np.arange(11))
c.set_ticklabels(np.arange(11))
plt.savefig('mesh.png')

这段代码产生了下面的图像,这里的问题是最深的蓝色被标记为 0,而该单元格中的值实际上是 1,同样所有其他标签都移动了 1。

这是错误还是功能?如果是功能,我如何确保标签以优雅的方式匹配?我想我设法对数据进行了一些测试,并试图找出第一个可见的刻度等等,但这似乎不是很 pythonic。

这是一项功能,因为您自己设置了 ticklabels(使用了错误的标签)。最好总是尽量避免手动设置 ticklabels,除非别无他法。

如果删除此行,标签将正确显示:

c.set_ticklabels(np.arange(11))

为了提高可读性,您还可以考虑对颜色进行标准化,使它们变得离散并匹配特定的整数值。但这只有在颜色总量有限的情况下才有效,如本例所示。

fig, ax = plt.subplots()

cmap = plt.cm.jet

bounds = np.arange(0.5,10.5,1)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

m = ax.pcolormesh(a, cmap=cmap, norm=norm)
c = plt.colorbar(m, ticks=bounds-0.5)