获取matplotlib颜色条标记在数据限制之外,以便与boundary关键字一起使用

amc*_*orl 4 python matplotlib colorbar

我正在尝试使用颜色条来标记使用imshow绘制的离散编码值.我可以使用boundariesvalues关键字来实现我想要的颜色条,这使得颜色条的最大值有效地大于绘制的数据的最大值.

现在我希望刻度线位于颜色条中每个颜色范围的中间,但是不能为颜色条中的最大颜色块指定刻度位置,因为它超出了数据值限制.

这是一个快速的代码块来演示这个问题:

data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(data[None], aspect='auto')
cax = fig.add_subplot(122)
cbar = fig.colorbar(ax.images[0], cax=cax, boundaries=[0,1,2,3,4], values=[0,1,2,3])
cbar.set_ticks([.5, 1.5, 2.5, 3.5])
cbar.set_ticklabels(['one', 'two', 'three', 'four'])
Run Code Online (Sandbox Code Playgroud)

注意丢失的刻度应该是'四'.这样做的正确方法是什么?

amc*_*orl 6

总而言之,这对我有用:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from matplotlib import colors

data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cmap = cm.get_cmap('jet', 4)
bounds = np.arange(5)
vals = bounds[:-1]
norm = colors.BoundaryNorm(bounds, cmap.N)
ax.imshow(data[None], aspect='auto', interpolation='nearest', cmap=cmap, norm=norm)

cax = fig.add_subplot(122)
cbar = fig.colorbar(ax.images[0], cax=cax, boundaries=bounds, values=vals)
cbar.set_ticks(vals + .5)
cbar.set_ticklabels(['one', 'two', 'three', 'four'])
Run Code Online (Sandbox Code Playgroud)

解决方案是使用get_cmap和限制为图像明确指定色彩映射BoundaryNorm.然后指定刻度位置就可以了.结果图是:

离散色条示例