如何在 matplotlib 中向 im​​show() 添加图例

Posted

技术标签:

【中文标题】如何在 matplotlib 中向 im​​show() 添加图例【英文标题】:How to add legend to imshow() in matplotlib 【发布时间】:2014-10-18 10:11:15 【问题描述】:

我正在使用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',...)

    如果没有,如何为矩阵中的每个值添加标签。例如,将矩阵 'grass' 中的所有 1 标记,将矩阵 'sand' 中的所有 2 标记...等等。

谢谢!

编辑

感谢@dnalow,它真的很聪明。不过,我还是想知道有没有正式的解决方案。

【问题讨论】:

【参考方案1】:

我在这里引用a similar question 的解决方案,以防有人仍然感兴趣:

我想,只有在没有太多值的情况下,才能为矩阵中的所有值添加图例。因此,假设您的矩阵中有 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()

【讨论】:

【参考方案2】:

您可以使用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 text examples

【讨论】:

【参考方案3】:

我只是在做同一个项目来绘制像您的问题一样的土地利用图。这是我根据上述答案的解决方案。

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()

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

【讨论】:

【参考方案4】:

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

你可以这样做:

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()

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

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

【讨论】:

聪明!我会试试看!谢谢! 查看***.com/questions/18704353/… 的答案,您可以使用离散的颜色条和更正的标签找到更合适的解决方案。这不是您最初要求的,但可能是一个不错的选择。 非常感谢!那是高级彩条,但你的很适合我的情况。以后两个都会有用的,再次感谢~

以上是关于如何在 matplotlib 中向 im​​show() 添加图例的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt4 中向 MPL 图添加工具栏

matplotlib savefig() 绘图不同于 show()

matplotlib:如何在图像上绘制矩形

如何使用 python 的 matplotlib 重绘图像?

如何从matplotlib中的图形中检索颜色条实例

Matplotlib:make_image()莫名其妙的错误