Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取超出数据限制的matplotlib颜色条勾号,以便与Bounders关键字一起使用_Python_Matplotlib_Colorbar - Fatal编程技术网

Python 获取超出数据限制的matplotlib颜色条勾号,以便与Bounders关键字一起使用

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

我试图使用颜色条来标记使用imshow绘制的离散编码值。我可以使用
边界
关键字实现我想要的颜色条,这使得颜色条的最大值实际上比正在绘制的数据的最大值大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
的意思是要设置
边界
,这样两个图中的限制都是相同的——基本上就是您现在所做的。