6

我正在尝试使用颜色条来标记使用 imshow 绘制的离散编码值。boundaries我可以使用and关键字来实现我想要的颜色values条,这使得颜色条的最大值实际上比正在绘制的数据的最大值大 1。

现在我希望刻度位于颜色栏中每个颜色范围的中间,但无法为颜色栏中最大的颜色块指定刻度位置,似乎是因为它超出了数据值限制。

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

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

2 回答 2

7

总而言之,这对我有用:

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-25T13:38:04.313 回答
3

colormapimshow和中没有使用相同的内容cbar。由于您的dataandcbar以相同的方式定义(相同的限制等),因此您没有意识到上面示例中的不一致。你应该定义第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()

在此处输入图像描述

于 2012-09-25T07:27:25.870 回答