迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Matplotlib 中错误 No Handles With Labels Found to Put in Legend

作者:迹忆客 最近更新:2023/05/02 浏览次数:

本文演示了我们如何解决在尝试使用 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()

执行程序后,我们会看到以下输出。

Problem Output

在上面提到的代码中,当尝试绘制图形时,我们收到一个错误,给出如下:

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'])

现在标签已经定义好了,警告就不会出现了,我们的图就绘制成功了,如下所示。

Solution 1

有时我们会忘记声明图例的标签,这可能是一个很常见的错误。 每当我们声明图形的元素时,声明标签是一个好习惯; 这种方法有助于减少错过特定标签声明的机会。

从代码中可以看出,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() 的顺序已经固定,绘图将包含定义的图例。

Solution 2

完整代码:

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

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 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便