代码之家  ›  专栏  ›  技术社区  ›  Jane Sully

使用imshow[duplicate]将列表列表可视化为Matplotlib热图

  •  -2
  • Jane Sully  · 技术社区  · 6 年前

    cmap 未使用正确映射到图像 plt.imshow .

    resr 如果不指定cmap,我会看到:

    resr = np.array([[0,2],[3,4]],dtype=int)
    plt.imshow(resr)
    

    enter image description here

    这看起来不错。当我尝试通过指定颜色的cmap时,使用:

    cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
    cmap = colors.ListedColormap(cmap1) 
    plt.imshow(resr, cmap=cmap)
    

    我懂了:

    enter image description here

    cmap1[3] 3 4 . 为什么会这样?

    0 回复  |  直到 6 年前
        1
  •  2
  •   ImportanceOfBeingErnest    6 年前

    我在这里看到两种选择:

    答。将数据映射到类别

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.colors as colors
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    resr = np.array([[0,2],[3,4]],dtype=int)
    u, ind = np.unique(resr, return_inverse=True)
    norm = colors.BoundaryNorm(np.arange(len(u)+1)-.5, len(u))
    cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
    cmap = colors.ListedColormap(cmap1) 
    
    fig,ax = plt.subplots()
    im = ax.imshow(ind.reshape(resr.shape), cmap=cmap,norm=norm)
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%")
    
    cb = plt.colorbar(im, cmap=cmap,norm=norm,cax=cax)
    
    cb.set_ticks(np.arange(len(u)))
    cb.ax.set_yticklabels(cmap1)
    cb.ax.tick_params(labelsize=10)
    
    plt.show()
    

    B。将类别映射到数据

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.colors as colors
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    resr = np.array([[0,2],[3,4]],dtype=int)
    
    u = np.unique(resr)
    bounds = np.concatenate(([resr.min()-1], u[:-1]+np.diff(u)/2. ,[resr.max()+1]))
    print(bounds)
    norm = colors.BoundaryNorm(bounds, len(bounds)-1)
    cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
    cmap = colors.ListedColormap(cmap1) 
    
    fig,ax = plt.subplots()
    im = ax.imshow(resr, cmap=cmap,norm=norm)
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%")
    
    cb = plt.colorbar(im, cmap=cmap,norm=norm,cax=cax)
    
    cb.set_ticks(bounds[:-1]+np.diff(bounds)/2.)
    cb.ax.set_yticklabels(cmap1)
    cb.ax.tick_params(labelsize=10)
    
    plt.show()
    

    enter image description here

        2
  •  0
  •   dubbbdan    6 年前

    以下是@ImportanceOfBeingErnest的评论,提供了他们 post ,我找到了解决办法。

    诀窍是用传球 np.unique(resr) BoundaryNorm

    resr = np.array([[0,2],[3,4]],dtype=int)
    
    norm = colors.BoundaryNorm(np.unique(resr), len(np.unique(resr))-1)
    cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
    cmap = colors.ListedColormap(cmap1) 
    plt.imshow(resr, cmap=cmap,norm=norm);plt.colorbar()
    

    返回预期结果:

    enter image description here