您好我有以下代码:
rateMap, occMap, spikeMap = pickle.load(open(rateMapFileName))
pl.imshow(rateMap)
pl.colorbar()
现在,occMap是包含多个时间戳的x,y位置的占用地图。存在一些没有占用的点x,y位置(即,在该矩阵值处= 0值)
当我使用上面的脚本绘制rateMap(这是= spikeMap / occMap)时。生成的颜色条使用默认的 jetmap 色彩映射。我希望 occMap 中的null / 0值在rateMap图中显示为 white 。那么无论如何要为colorbar函数添加零?并将其与occMap相关联
我尝试查看此脚本How to add "black" to matplotlib colormap?但是无法使其运行?
这是一个示例图像,其中白点基本上是指x,y位置为0值或没有占用:
***** **** EDIT 我尝试使用代码,这里是我如何为colormap添加白色但我想将此白色添加到默认的喷射色彩映射。有什么建议??
cmap = LinearSegmentedColormap.from_list('mycmap', ['white', 'blue', 'cyan', 'green', 'yellow','red'])
fig, ax = plt.subplots()
im = ax.imshow(im, cmap=cmap, interpolation='nearest')
fig.colorbar(im)
plt.show()
答案 0 :(得分:0)
对于您的问题,我建议将第一级设置为大于零,并使用颜色栏的扩展功能指定零个x,y位置。
首先,我们导入库,并尝试在稀疏网格上根据numpy
的正态分布函数生成一些随机数据。
from copy import copy
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
# generate sample data
x0, x1 = -5, 5
y0, y1 = -3, 3
x = np.linspace(x0, x1, 60)
y = np.linspace(y0, y1, 60)
X, Y = np.meshgrid(x, y)
Z = np.random.randn(60, 60)
为说明您的问题,我们将所有负值都设置为零,以呈现非负网格数据Z
。
Z = np.where(Z > 0, Z, 0)
现在到了关键点!只需在颜色表中添加超出范围的颜色即可。
palette = copy(plt.get_cmap('viridis_r'))
palette.set_under('white', 1.0) # 1.0 represents not transparent
您还可以使用set_over
,set_bad
方法为超范围数据和未定义(NaN)数据设置颜色。
设置子图:
fig, ax = plt.subplots(1, 1)
设置图的级别,但切记将最低级别修改为接近零的正数。
levels = np.arange(0, 3.5, 0.5)
levels[0] = 1e-5
这里是绘制数组Z的方法。
norm = colors.BoundaryNorm(levels, ncolors=palette.N)
im = ax.imshow(Z, cmap=palette,
norm=norm,
aspect='auto', extent=[x0, x1, y0, y1])
# Possible extend options include: ['min', 'max', 'both', 'neither']
cbar = fig.colorbar(im, extend='min', shrink=0.9, ax=ax)
plt.savefig('draw.png', dpi=300)
# or
# plt.show()
将最低级别显示为0.0可能会引起歧义,也许将level [0]设置为0.1看起来更好。
您可以参考以下链接以获得更多信息:
https://matplotlib.org/examples/pylab_examples/image_masked.html
https://matplotlib.org/examples/pylab_examples/contourf_demo.html