代码之家  ›  专栏  ›  技术社区  ›  amcmorl

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

  •  6
  • amcmorl  · 技术社区  · 12 年前

    我正在尝试使用颜色条来标记使用imshow绘制的离散编码值。我可以使用 boundaries values 关键字,这使得颜色条的最大值实际上比正在绘制的数据的最大值大1。

    现在,我希望勾号位于颜色栏中每个颜色范围的中间,但无法为颜色栏中最大颜色块指定勾号位置,似乎是因为它超出了数据值限制。

    以下是演示该问题的快速代码块:

    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'])
    

    注意“四”应该在的地方缺失的勾号。正确的方法是什么?

    2 回复  |  直到 12 年前
        1
  •  7
  •   amcmorl    12 年前

    总之,这对我来说很有效:

    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_cmap 并以 BoundaryNorm 。然后指定刻度位置就可以了。结果图为:

    discrete colorbar example

        2
  •  3
  •   imsc    12 年前

    您没有使用相同的 colormap 在里面 imshow cbar .作为您的 data cbar公司 以相同的方式定义(相同的限制等),因此您没有意识到上面示例中的不一致性。您应该定义 颜色表 第一

    假设您想将数据划分为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()
    

    enter image description here

    您现在可以将 ticks 根据您的需要。

    如果您想定义边界以及这些边界中的颜色,则可以使用 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()
    

    enter image description here