我正在尝试使用颜色条来标记离散的、使用imshow绘制的编码值。我可以使用boundaries和values关键字获得我想要的颜色条,这使得颜色条的最大值实际上比正在绘制的数据的最大值大1。
现在我希望刻度在colorbar中的每个颜色范围的中间,但不能为colorbar中最大的颜色块指定刻度位置,似乎是因为它超出了数据值限制。
以下是演示该问题的快速代码块:
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'])注意“4”应该出现的地方缺少的勾号。这样做的正确方法是什么?
发布于 2012-09-25 21:38:04
总而言之,这对我很有效:
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'])解决方案是使用get_cmap显式指定图像的色彩映射表,并以BoundaryNorm为界限。然后指定刻度位置就可以了。生成的曲线图为:

发布于 2012-09-25 15:27:26
您在imshow和cbar中使用的colormap不同。因为您的data和cbar是以相同的方式定义的(相同的限制等)所以你没有意识到上面例子中的不一致之处。您应该首先定义colormap。
假设你想把数据分成4种不同的颜色,然后你可以使用
import numpy as np
import pylab as plt
from matplotlib import colors, cm
data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cax = fig.add_subplot(122)
cmap = cm.get_cmap('jet', 4) # 4 discrete color
im=ax.imshow(data[None], aspect='auto',cmap=cmap)
cbar = fig.colorbar(ax.images[0], cax=cax, cmap=cmap)
plt.show()

现在,您可以根据需要放置ticks。
如果您想定义边界以及这些边界中的颜色,则可以使用ListedColormap,如下所示:
data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cax = fig.add_subplot(122)
cmap = colors.ListedColormap(['b','g','y','r'])
bounds=[0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)
im=ax.imshow(data[None], aspect='auto',cmap=cmap, norm=norm)
cbar = fig.colorbar(im, cax=cax, cmap=cmap, norm=norm, boundaries=bounds, ticks=[0.5,1.5,2.5,3.5],)
plt.show()

https://stackoverflow.com/questions/12570627
复制相似问题