查看全课大纲(第 41 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

如何为图表添加图例,让不同曲线一目了然?

约 4 分钟

小象实战讲义 · Python 编程从入门到实践

在上一节,我们学习了如何在同一张图表中绘制多条曲线。当曲线增多时,如何清晰地告诉读者每条线代表什么数据呢?本节将介绍图例(Legend)的使用,它能为每条曲线添加标签,是制作专业、易读图表的关键一步。学完本节,你就能为你的多线图表配上清晰的说明。

💡 核心导读

  • 图例的作用:为图表中的不同数据系列(如多条曲线)添加标签说明。
  • 添加标签:在 plt.plot() 函数中使用 label 参数为每条曲线命名。
  • 显示图例:调用 plt.legend() 函数在图表上显示图例。
  • 调整位置:通过 loc 参数控制图例在图表中的位置,避免遮挡数据。

图例是什么?为什么需要它?

图例是图表中的一个方框,里面包含了图表中各种图形元素(如线条、标记、颜色块)的样本及其对应的文字标签。它的核心作用是解释图表中不同视觉元素所代表的数据含义。

想象一下,一张图表里画了一条蓝线和一条红线。如果不加说明,读者只能猜测“蓝线可能是A数据,红线可能是B数据”。而通过图例,我们可以明确地标注出“蓝线:线性增长”、“红线:平方增长”,让图表的信息传递变得准确无误。

在 Matplotlib 中,为图表添加图例是一个两步过程:1. 为数据系列设置标签;2. 调用函数显示图例。

如何为曲线添加标签并显示图例?

首先,我们需要在绘制每条曲线时,通过 plt.plot() 函数的 label 参数为其指定一个名字。

import matplotlib
matplotlib.use("Agg")  # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np

# 准备数据
x = np.linspace(-3, 3, 50)
y_linear = 2 * x + 1   # 线性函数 y = 2x + 1
y_square = x ** 2       # 二次函数 y = x^2

# 创建图表
plt.figure(figsize=(6, 4))

# 绘制第一条曲线,并设置标签为"线性函数"
plt.plot(x, y_linear, label='线性函数 (y=2x+1)')

# 绘制第二条曲线,设置不同的线型和颜色,并设置标签
plt.plot(x, y_square, color='red', linestyle='--', label='平方函数 (y=x²)')

# 设置坐标轴标签
plt.xlabel('x 轴')
plt.ylabel('y 轴')

# 显示图例,放在右上角
plt.legend(loc='upper right')

# 在无头环境中,我们关闭图形以释放资源
plt.close()

执行后会得到一张图表:图中有一条蓝色实线(线性函数)和一条红色虚线(平方函数);在图表右上角出现一个图例框,里面用对应的颜色和线型标注了 “线性函数 (y=2x+1)” 和 “平方函数 (y=x²)”。

关键点解析:

  • label='线性函数 (y=2x+1)':在 plot 函数中定义这条曲线的标签。这个字符串会出现在图例中。
  • plt.legend():这个函数调用会收集当前图表中所有设置了 label 的图形元素,并将它们以图例的形式绘制出来。
  • 图例的样式(颜色、线型)会自动匹配对应曲线的样式。

如何调整图例的位置?

默认情况下,plt.legend() 会将图例放在一个它认为合适的位置(通常是“最佳”位置)。但有时图例会遮挡关键数据,我们可以通过 loc 参数来手动指定位置。

loc 参数接受一个字符串或一个代表位置的代码,常用的位置有:

  • 'upper right':右上角
  • 'upper left':左上角
  • 'lower left':左下角
  • 'lower right':右下角
  • 'center':正中央
  • 'best':自动选择最佳位置(默认)
import matplotlib
matplotlib.use("Agg")  # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np

# 使用相同的数据
x = np.linspace(-1, 2, 30)
y1 = 2 * x + 1
y2 = x ** 2

plt.figure(figsize=(5, 5))
plt.xlim((-1, 2))
plt.ylim((-2, 3))
plt.xlabel('x 值')
plt.ylabel('y 值')

plt.plot(x, y1, label='Y = 2X + 1')
plt.plot(x, y2, color='red', linestyle='--', label='Y = X²')

# 将图例放置在左上角,避免遮挡右上角的曲线
plt.legend(loc='upper left')

plt.close()

执行代码后,图例框会出现在图表的左上角区域。

使用 loc='best': 如果你不确定放哪里好,或者希望 Matplotlib 自动找一个不遮挡数据的位置,可以使用 loc='best'。这是 plt.legend() 的默认行为,所以不写 loc 参数效果相同。

import matplotlib
matplotlib.use("Agg")  # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y1 = 2 * x + 1
y2 = x ** 2

plt.figure(figsize=(7, 4))
plt.plot(x, y1, label='Y = 2X + 1')
plt.plot(x, y2, color='red', linestyle='--', label='Y = X²')

# 让工具自动选择最佳位置
plt.legend(loc='best')

plt.close()

执行代码时,Matplotlib 会计算数据点和坐标轴的位置,将图例放置在一个空白相对较大的区域。

如果输错了位置参数:如果你不小心写了一个不存在的位置代码,比如 loc='center top',Python 会报错,并在错误信息中提示相近的可用位置,例如 Did you mean one of: 'center left', 'center', 'center right'?,这其实是一个快速查看可用选项的方法。

📝 动手练一练

  1. 修改图例标签:将本节第一个示例中的图例标签从“线性函数 (y=2x+1)”和“平方函数 (y=x²)”改为更简洁的“Line 1”和“Line 2”,并观察图例的变化。
  2. 探索所有位置:尝试将 loc 参数分别改为 'lower right', 'center left', 'upper center',运行代码并观察图例在图中的位置。
👉 点击查看参考答案

思路:第一个练习只需修改 plot 函数中的 label 字符串。第二个练习需要修改 plt.legend() 的 loc 参数值。

参考代码片段:

import matplotlib
matplotlib.use("Agg")  # 无图形界面后端
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1, 1, 20)
y1 = x
y2 = x**3

plt.figure()
plt.plot(x, y1, label='Line 1')  # 修改了标签
plt.plot(x, y2, label='Line 2')  # 修改了标签
plt.legend(loc='lower right')    # 尝试改为 'center left', 'upper center' 等
plt.close()

常见错误

错误写法现象或报错原因正确写法
先 plt.plot(x, y),再 plt.legend(['曲线A'])图例能显示,但文字与曲线的对应关系容易被顺序搞错。legend() 接收列表时会按绘图顺序覆盖每条曲线的标签,曲线一多就难与数据对应。在 plot 时使用 label 参数:
plt.plot(x, y, label='曲线A')
plt.legend()
忘记调用 plt.legend()图表上没有显示图例。设置了 label 只是“注册”了标签信息,必须调用 plt.legend() 函数才会将图例绘制到图表上。确保在 plot 所有曲线并设置 label 后,调用 plt.legend()。
label 参数拼写错误,如写成 lableAttributeError: Line2D.set() got an unexpected keyword argument 'lable'plot 会把未知关键字原样传给线对象,拼写错误会直接报错,而不是被静默忽略。检查拼写,确保是 label。

小结

  1. 图例(Legend) 是图表中用于说明不同数据系列含义的标识框。
  2. 为曲线添加图例需要两步:在 plt.plot() 中使用 label 参数命名曲线;调用 plt.legend() 显示图例。
  3. plt.legend() 的 loc 参数用于控制图例位置,常用值有 'upper right'(右上)、'upper left'(左上)、'best'(最佳)等。
  4. 如果图表未显示图例,首先检查:① plot 时是否设置了 label;② 是否调用了 plt.legend()。
  5. 图例的位置应避免遮挡关键数据点,通常使用 'best' 或手动调整到空白区域。

📋 行动清单

  • 运行本节的所有示例代码,确认图例能正常显示。
  • 将 loc 参数从 'upper right' 依次改为 'lower left', 'center', 'right',运行并观察图例位置的变化。
  • 尝试在一张图上绘制三条不同颜色的水平线,并为它们分别设置有意义的 label(例如“及格线”、“良好线”、“优秀线”),然后添加图例。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第5章代码包:Legend(含1 个 Notebook)
    ZIP · 14KB
    下载