如何在matplotlib中向imshow()添加图例

ran*_*rst 7 python label matplotlib legend imshow

我在用 matplotlib

plot()或者bar(),我们可以很容易地把传说,如果标签添加到他们.但是,如果它是一个contourf()imshow()

我知道有一个colorbar()可以呈现颜色范围,但不满意.我想要一个有名字(标签)的传奇.

在此输入图像描述

我可以想到的是,为矩阵中的每个元素添加标签,然后尝试使用legend(),看看它是否有效,但是如何向元素添加标签,如值?

就我而言,原始数据如下:

1,2,3,3,4
2,3,4,4,5
1,1,1,2,2
Run Code Online (Sandbox Code Playgroud)

例如,1代表'grass',2代表'sand',3代表'hill'......等等.imshow()与我的案例完美配合,但没有传说.

我的问题是:

  1. 是否有一个可以自动添加图例的功能,例如,在我的情况下,我只需这样做:someFunction('grass','sand',...)

  2. 如果没有,我如何为矩阵中的每个值添加标签.例如,在矩阵'grass'中标记所有1,在矩阵'sand'中标记所有2 ...依此类推.

谢谢!

编辑:

感谢@dnalow,它真的很聪明.但是,我仍然想知道是否有任何正式的解决方案.

Imp*_*est 22

我在这里引用一个类似问题的解决方案,以防有人仍然感兴趣:

我想在矩阵中为所有值设置一个图例只有在没有太多的情况下才有意义.因此,假设您的矩阵中有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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 7

我只是在同一个项目上工作,以绘制像您的问题一样的土地利用地图。这是我按照上述答案的解决方案。

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()
Run Code Online (Sandbox Code Playgroud)

结果显示如下

这个分辨率看起来不是很好,但它可以工作。我也在寻找我的其他方法。


mar*_*jay 5

您可以使用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()
Run Code Online (Sandbox Code Playgroud)

它给你以下 随机噪音

有关matplotlib文本示例的更多详细信息,请查看有关文本的matplotlib文档


小智 3

我想你必须伪造你的图例,因为它需要一条线来创建图例。

你可以这样做:

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()
Run Code Online (Sandbox Code Playgroud)

当然,这还不是很令人满意。但也许你可以在此基础上构建一些东西。

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