Python 获取超出数据限制的matplotlib颜色条勾号,以便与Bounders关键字一起使用
我试图使用颜色条来标记使用imshow绘制的离散编码值。我可以使用Python 获取超出数据限制的matplotlib颜色条勾号,以便与Bounders关键字一起使用,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我试图使用颜色条来标记使用imshow绘制的离散编码值。我可以使用边界和值关键字实现我想要的颜色条,这使得颜色条的最大值实际上比正在绘制的数据的最大值大1 现在我希望TIKS在彩条中的每个颜色范围的中间,但是不能为COLBAR中的最大颜色块指定一个刻度位置,因为它在数据值限制之外。p> 下面是一个快速代码块来演示问题: data = np.tile(np.arange(4), 2) fig = plt.figure() ax = fig.add_subplot(121) ax.imshow(da
边界
和值
关键字实现我想要的颜色条,这使得颜色条的最大值实际上比正在绘制的数据的最大值大1
现在我希望TIKS在彩条中的每个颜色范围的中间,但是不能为COLBAR中的最大颜色块指定一个刻度位置,因为它在数据值限制之外。p> 下面是一个快速代码块来演示问题:
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'])
注意“四”应该在哪里缺少勾号。正确的方法是什么?您在
imshow
和cbar
中没有使用相同的colormap
。由于您的数据
和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()
现在,您可以根据需要设置勾号
如果要定义边界以及这些边界中的颜色,则可以使用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()
总而言之,这对我很有用:
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\u cmap
明确指定图像的颜色映射,并以BoundaryNorm
为边界。然后指定记号位置就行了。结果图为:
此后,我通过不使用Figure.colorbar,而是在cax轴中绘制
范围(最大值(数据)+1)
,然后根据需要设置轴标记和标签,破解了一个解决方案。但是,如果有一种干净的方法可以使用colorbar实现这一点,那就太好了。事实上,这并不完全正确:默认情况下,colorbar会获取可映射的colormap(在本例中,ax
;look in matplotlib的colorbar.py:colorbar.\uu_uinit\uuu中的图像),因此无需在对colorbar的调用中指定colormap。使用get\u cmap
指定截断的cmap,并应用BoundaryNorm
规范化确实解决了问题。谢谢你的指点。当然默认的colormap
是jet
。我定义colormap
的意思是要设置边界
,这样两个图中的限制都是相同的——基本上就是您现在所做的。