[英]How to add legend to imshow() in matplotlib
我正在使用matplotlib
在plot()
或bar()
,如果我们向其添加标签,则可以轻松放置图例。 但是如果它是contourf()
或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中的所有1标记为“草”,将矩阵2中的所有2标记为“沙” ...等等。
谢谢!
编辑 :
感谢@dnalow,它真的很聪明。 但是,我仍然想知道是否有任何正式的解决方案。
如果有人仍然感兴趣,我在这里引用一个类似问题的解决方案:
我想将所有值的图例放在矩阵中才有意义。 因此,假设您的矩阵中有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()
您可以使用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文档以获取更多详细信息matplotlib文本示例
我猜您必须伪造您的图例,因为它需要一行来创建图例。
您可以执行以下操作:
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()
当然,这还不是很令人满意。 但是也许您可以在此基础上有所建树。
[编辑:添加了缺少的括号]
我只是在同一个项目上绘制类似您的问题的土地使用图。 这是我根据上述答案的解决方案。
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()
这个分辨率看起来不太好,但是可以工作。 我也在寻找其他方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.