Matplotlib 中错误 No Handles With Labels Found to Put in Legend
本文演示了我们如何解决在尝试使用 Matplotlib 绘图时出现的警告 No handles with labels found to put in legend。
没有发现带有标签的句柄放在图例中
Matplotlib 广泛用于各种应用程序,是一个 Python 库,旨在为用户提供在一定程度上类似于 MATLAB 的功能。 它创建数据的静态、动画和交互式可视化,用于分析和其他目的。
在尝试使用 Matplotlib 绘制某些东西时,我们可能希望标记可视化图形的特定部分,这是一种常见的情况,无论是出于理解还是其他原因。 在此过程中,我们可能会遇到警告,提示由于某些错误而无法创建图例。
考虑以下代码。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
plt.axis([-5,5,-5,5])
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.grid()
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'r', length_includes_head = True)
plt.arrow(0, 0, 1, 3, head_width = 0.2, color = 'g', length_includes_head = True)
plt.arrow(0, 0, 4, 4, head_width = 0.2, color = 'b', length_includes_head = True)
plt.legend()
plt.show()
执行程序后,我们会看到以下输出。
在上面提到的代码中,当尝试绘制图形时,我们收到一个错误,给出如下:
No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when `legend()` is called with no argument.
从输出图像可以看出,没有生成图例; 而不是标签,我们只看到了情节。
解决No handles with labels found to put in legend in Matplotlib
如果在对绘制的图形调用 legend() 方法之前未提供标签参数,则会出现警告。
pyplot 是 Matplotlib 的基于状态的接口,支持在 Python 中进行交互式图形绘图。 legend() 方法可以为轴添加图例。
但是,如果我们省略 labels 选项然后调用 legend() 函数,我们将收到错误消息。
找不到带有标签的艺术家放入图例。 请注意,当不带参数调用 legend()
时,标签以下划线开头的艺术家将被忽略。 以下是弹出此警告的一些情况。
原因 1:未声明任何标签
可能是应该包含在图例中的标签最初没有声明。
考虑以下示例。
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'r', length_includes_head = True)
plt.arrow(0, 0, 1, 3, head_width = 0.2, color = 'g', length_includes_head = True)
plt.arrow(0, 0, 4, 4, head_width = 0.2, color = 'b', length_includes_head = True)
在上面的箭头声明中,没有为它们分配任何标签,这可能导致图例找不到应该添加到图例中的标签。
在我们的例子中,修复很简单,将标签添加到箭头。
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'r', length_includes_head = True, label = 'u')
plt.arrow(0, 0, 1, 3, head_width = 0.2, color = 'g', length_includes_head = True, label = 'v')
plt.arrow(0, 0, 4, 4, head_width = 0.2, color = 'b', length_includes_head = True, label = 'u+v')
除了在 plt.arrow()
方法内声明标签,我们还可以通过将标签传递给 plt.legend()
函数本身来声明标签。
plt.legend()
方法接受一个列表或元组,其中包含您可能想要在绘图中声明的必要标签。
考虑下面的例子。
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'r', length_includes_head = True)
plt.arrow(0, 0, 1, 3, head_width = 0.2, color = 'g', length_includes_head = True)
plt.arrow(0, 0, 4, 4, head_width = 0.2, color = 'b', length_includes_head = True)
plt.legend(['u','v','u+v'])
现在标签已经定义好了,警告就不会出现了,我们的图就绘制成功了,如下所示。
有时我们会忘记声明图例的标签,这可能是一个很常见的错误。 每当我们声明图形的元素时,声明标签是一个好习惯; 这种方法有助于减少错过特定标签声明的机会。
从代码中可以看出,matplotlib 允许将标签声明为多个函数的参数,这些函数创建不同的绘图元素(在我们的例子中是 plt.arrow())。
原因 2:传说后的情节
此问题的另一个根本原因可能是未正确遵循正确绘制图形的顺序; 比如在创建plot之前创建了legend,还是会弹出warning,legend也不会创建。
考虑以下代码。
plt.legend() # Wrong Placement
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'b', length_includes_head = True)
plt.arrow(0, 0, 3, 4, head_width = 0.2, color = 'g', length_includes_head = True)
在这里,我们在实际创建绘图之前调用了 legend() 函数; 由于在调用 legend() 函数时未声明任何标签(或绘图),因此会出现警告,并且图例将保持为空。
要解决此问题,请确保调用了 legend()。 图表的每个方面都用合适的标签绘制。
在我们的例子中,那将是:
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'b', length_includes_head = True, label = "x")
plt.arrow(0, 0, 3, 4, head_width = 0.2, color = 'g', length_includes_head = True, label = "y")
plt.legend() # Correct placement
现在 plt.legend()
的顺序已经固定,绘图将包含定义的图例。
完整代码:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
plt.axis([-5, 5, -5, 5])
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.grid()
plt.arrow(0, 0, 3, 1, head_width = 0.2, color = 'r', length_includes_head = True, label = 'u')
plt.arrow(0, 0, 1, 3, head_width = 0.2, color = 'g', length_includes_head = True, label = 'v')
plt.arrow(0, 0, 4, 4, head_width = 0.2, color = 'b', length_includes_head = True, label = 'u+v')
plt.legend()
# plt.legend(['u','v','u+v'])
plt.show()
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
Django 返回 JSON
发布时间:2023/05/04 浏览次数:106 分类:Python
-
在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。
在 Django 中创建对象
发布时间:2023/05/04 浏览次数:59 分类:Python
-
本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。
在 Django 中为多项选择创建字段
发布时间:2023/05/04 浏览次数:75 分类:Python
-
在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。