Python 移位颜色条matplotlib

Python 移位颜色条matplotlib,python,colors,matplotlib,Python,Colors,Matplotlib,我正在尝试为数据集创建填充轮廓。这应该相当简单: plt.contourf(x, y, z, label = 'blah', cm = matplotlib.cm.RdBu) 但是,如果我的数据集在0左右不对称,我该怎么办?假设我想从蓝色(负值)到0(白色),再到红色(正值)。如果我的数据集从-8变为3,那么颜色栏的白色部分(应该是0)实际上是略微负的。有什么方法可以改变颜色栏吗?首先,有多种方法可以做到这一点 将的实例作为normkwarg传递 使用colorskwarg到contourf并

我正在尝试为数据集创建填充轮廓。这应该相当简单:

plt.contourf(x, y, z, label = 'blah', cm = matplotlib.cm.RdBu)

但是,如果我的数据集在0左右不对称,我该怎么办?假设我想从蓝色(负值)到0(白色),再到红色(正值)。如果我的数据集从-8变为3,那么颜色栏的白色部分(应该是0)实际上是略微负的。有什么方法可以改变颜色栏吗?

首先,有多种方法可以做到这一点

  • 将的实例作为
    norm
    kwarg传递
  • 使用
    colors
    kwarg到
    contourf
    并手动指定颜色
  • 使用由
    matplotlib.colors.from\u levels\u和\u colors
    构建的离散颜色贴图
  • 最简单的方法是第一种选择。它也是允许您使用连续颜色贴图的唯一选项

    使用第一个或第三个选项的原因是,它们适用于使用彩色贴图的任何类型的matplotlib绘图(例如,
    imshow
    scatter
    ,等等)

    第三个选项从特定颜色构造一个离散的颜色映射和规格化对象。它基本上与第二个选项相同,但它将a)使用等高线图以外的其他类型的图,b)避免手动指定等高线的数量

    作为第一个选项的示例(我将在这里使用
    imshow
    ,因为它比
    tourtf
    对随机数据更有意义,但是
    tourtf
    除了
    插值
    选项外,还有相同的用法):

    作为第三个选项的示例(请注意,这将提供离散的colormap,而不是连续的colormap):


    应添加到Matplotlib@Joe金顿,那真是太棒了!我正在为一个开源项目复制您的类定义,并将您的名字作为作者。希望你能接受。@user832-加油!然而,保罗·霍布森(Paul Hobson)为最近向mpl提出的一个拉取请求编写了一个更完整的通用版本:根据您需要的功能,您可能最好将其作为基础。@JoeKington谢谢!我会检查保罗的答案,但现在你的答案正是我所需要的!正如@JoeKington上面提到的,中点规格化不处理许多边缘情况。我需要一个解决方案,它使用一个包含所有零的起始数组,然后随着值随时间的变化而更新。我最终采用了不同的标准来处理这个案子。这一问题的强有力解决方案显然非常困难,以至于开发工作不再进行。这似乎有些奇怪,因为在使用带有正负数据的发散调色板时,将0设置为中心点是一个常见的用例。
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import DivergingNorm
    
    data = np.random.random((10,10))
    data = 10 * (data - 0.8)
    
    fig, ax = plt.subplots()
    im = ax.imshow(data, norm=DivergingNorm(0), cmap=plt.cm.seismic, interpolation='none')
    fig.colorbar(im)
    plt.show()
    
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import from_levels_and_colors
    
    data = np.random.random((10,10))
    data = 10 * (data - 0.8)
    
    num_levels = 20
    vmin, vmax = data.min(), data.max()
    midpoint = 0
    levels = np.linspace(vmin, vmax, num_levels)
    midp = np.mean(np.c_[levels[:-1], levels[1:]], axis=1)
    vals = np.interp(midp, [vmin, midpoint, vmax], [0, 0.5, 1])
    colors = plt.cm.seismic(vals)
    cmap, norm = from_levels_and_colors(levels, colors)
    
    fig, ax = plt.subplots()
    im = ax.imshow(data, cmap=cmap, norm=norm, interpolation='none')
    fig.colorbar(im)
    plt.show()