Python 如何将图例添加到matplotlib中的imshow()

Python 如何将图例添加到matplotlib中的imshow(),python,matplotlib,label,legend,imshow,Python,Matplotlib,Label,Legend,Imshow,我正在使用matplotlib 在plot()或bar()中,如果我们在图例中添加标签,就可以轻松地放置图例。但是如果它是一个tourtf()或imshow() 我知道有一个colorbar()可以显示颜色范围,但它并不令人满意。我想要这样一个有名字(标签)的图例 因为我能想到的是,给矩阵中的每个元素添加标签,然后尝试legend(),看看它是否有效,但是如何给元素添加标签,比如值 在我的例子中,原始数据如下所示: 1,2,3,3,4 2,3,4,4,5 1,1,1,2,2 例如,1代表“草

我正在使用
matplotlib

plot()
bar()
中,如果我们在图例中添加标签,就可以轻松地放置图例。但是如果它是一个
tourtf()
imshow()

我知道有一个
colorbar()
可以显示颜色范围,但它并不令人满意。我想要这样一个有名字(标签)的图例

因为我能想到的是,给矩阵中的每个元素添加标签,然后尝试legend(),看看它是否有效,但是如何给元素添加标签,比如值

在我的例子中,原始数据如下所示:

1,2,3,3,4
2,3,4,4,5
1,1,1,2,2
例如,1代表“草”,2代表“沙”,3代表“山”。。。等等 imshow()非常适合我的案例,但没有图例

我的问题是:

  • 是否有一个函数可以自动添加图例,例如,在我的例子中,我只需要这样做:someFunction('grass','sand',…)

  • 如果没有,如何向矩阵中的每个值添加标签。例如,将矩阵中的所有1标记为“草”,将矩阵中的所有2标记为“沙”…依此类推

  • 谢谢大家!

    编辑


    多亏了@dnalow,它真的很聪明。但是,我仍然想知道是否有正式的解决方案。

    我想你必须伪造你的传奇,因为它需要一行代码来创建传奇

    您可以这样做:

    import pylab as pl
    mycmap = pl.cm.jet # for example
    for entry in pl.unique(raw_data):
        mycolor = mycmap(entry*255/(max(raw_data) - min(raw_data)))
        pl.plot(0, 0, "-", c=mycolor, label=mynames[entry])
    
    pl.imshow(raw_data)
    pl.legend()
    
    当然,这还不是很令人满意。但也许你可以在此基础上做点什么


    [编辑:添加缺少的括号]

    您可以使用
    matplotlib.pylab.text
    向绘图中添加文本,并将其自定义为图例

    例如:

    import numpy as np
    import matplotlib.cm as cm
    import matplotlib.pylab as plt
    
    raw_data = np.random.random((100, 100))
    fig, ax = plt.subplots(1)
    ax.imshow(raw_data, interpolation='nearest', cmap=cm.gray)
    ax.text(5, 5, 'your legend', bbox={'facecolor': 'white', 'pad': 10})
    plt.show()
    
    这给了你以下的信息


    您可以查看文本上的matplotlib文档以了解更多详细信息

    我在此引用一个解决方案,以防有人仍然感兴趣:

    我认为,只有在矩阵中没有太多值的情况下,才能为所有值创建图例。假设矩阵中有8个不同的值。然后,我们可以为每个人创建各自颜色的代理艺术家,并将他们放入这样的传奇中

    import matplotlib.pyplot as plt
    import matplotlib.patches as mpatches
    import numpy as np
    
    # create some data
    data = np.random.randint(0, 8, (5,5))
    # get the unique values from data
    # i.e. a sorted list of all values in data
    values = np.unique(data.ravel())
    
    plt.figure(figsize=(8,4))
    im = plt.imshow(data, interpolation='none')
    
    # get the colors of the values, according to the 
    # colormap used by imshow
    colors = [ im.cmap(im.norm(value)) for value in values]
    # create a patch (proxy artist) for every color 
    patches = [ mpatches.Patch(color=colors[i], label="Level {l}".format(l=values[i]) ) for i in range(len(values)) ]
    # put those patched as legend-handles into the legend
    plt.legend(handles=patches, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0. )
    
    plt.grid(True)
    plt.show()
    

    我只是在做同一个项目,画一幅像你的问题一样的土地利用图。下面是我的解决方案,按照上面的答案

    import matplotlib.pyplot as plt
    import matplotlib.patches as mpatches
    import numpy as np
    ##arrayLucc is the array of land use types 
    arrayLucc = np.random.randint(1,4,(5,5))
    ## first you need to define your color map and value name as a dic
    t = 1 ## alpha value
    cmap = {1:[0.1,0.1,1.0,t],2:[1.0,0.1,0.1,t],3:[1.0,0.5,0.1,t]}
    labels = {1:'agricultural land',2:'forest land',3:'grassland'}
    arrayShow = np.array([[cmap[i] for i in j] for j in arrayLucc])    
    ## create patches as legend
    patches =[mpatches.Patch(color=cmap[i],label=labels[i]) for i in cmap]
    
    plt.imshow(arrayShow)
    plt.legend(handles=patches, loc=4, borderaxespad=0.)
    plt.show()
    


    这个决议似乎不是很好,但它可以工作。我也在寻找我的其他方法

    聪明!我要试试看!谢谢检查答案,你可以找到一个更合适的解决方案,使用一个离散的色条和更正标签。这不是您最初要求的,但可能是一个很好的选择。非常感谢!这是高级色条,但你的很适合我的情况。这两种方法将来都会有用的,再次感谢~