在python中使用matplotlib创建的自定义颜色贴图居中

在python中使用matplotlib创建的自定义颜色贴图居中,python,matplotlib,imshow,colormap,Python,Matplotlib,Imshow,Colormap,这一次有一个问题:) 目前我正在使用pylab.imshow()和/或pylab.contour()。为了便于说明,我加入了彩色贴图。然而,我不太喜欢可用的彩色地图。为此,我决定使用以下代码创建一个: import numpy import matplotlib as mpl import matplotlib.pylab as plt def make_cmap(colors): position = numpy.linspace(0,1,len(colors)) cdic

这一次有一个问题:)

目前我正在使用
pylab.imshow()
和/或
pylab.contour()。为了便于说明,我加入了彩色贴图。然而,我不太喜欢可用的彩色地图。为此,我决定使用以下代码创建一个:

import numpy
import matplotlib as mpl
import matplotlib.pylab as plt

def make_cmap(colors):
    position = numpy.linspace(0,1,len(colors))

    cdict = {'red':[], 'green':[], 'blue':[]}
    for pos, color in zip(position, colors):
        cdict['red'].append((pos, color[0], color[0]))
        cdict['green'].append((pos, color[1], color[1]))
        cdict['blue'].append((pos, color[2], color[2]))

    cmap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 256)
    return cmap

colors = [(0, 0, 1), (1, 1, 1), (1, 0, 0)]  #cmap from blue to white to red.

plt.figure()
plt.imshow(Data, cmap = make_cmap(colors))
plt.show()
这个函数运行得很好。然而,我仍然缺少一个居中选项。使用此选项,我希望将颜色贴图居中于零附近。上面的颜色图范围从蓝色到红色,中间是白色

默认情况下,matplotlib将标准化颜色贴图,使最大颜色贴图值为
数据的最大值。但是,如果数据不包含任何负值,我想放弃彩色贴图的蓝色部分,因为在比较不同的图像时,它会非常混乱。如果
数据
不包含正值,则反之亦然

我知道我可以使用
vmin
vmax
设置限制。然而,这并不是我真正想要的。我希望在我的功能中包括居中选项,以便根据
数据


有什么想法吗?

我想你想做这样的事情:实际上,我想你想要的是一个自定义的
标准化
,而不是自定义的颜色映射。我一直在研究
标准化
,这确实是我需要的。事实上,我发现了一个类似的问题,你乔回答了这个问题。但是,如果我有多个颜色条,所有颜色条都具有不同的vmin和vmax,我需要为所有颜色条重新定义norm。如果不这样做,则将设置范围从0到1的第一个范数应用于所有颜色栏。即使是在-10到1的范围内。是否有办法重新定义所有这些标准?