查看全课大纲(第 41 / 51 节)
- 1.Python 是什么?为什么值得学?
- 2.如何为 Python 编程准备一个“全家桶”环境?
- 3.Python 有哪几种执行方法?
- 4.行与缩进到底有什么用?
- 5.注释有什么用,怎么写?
- 6.变量:如何给数据起个好名字?
- 7.运算符的优先级和常见坑点是什么?
- 8.Python 中,数字和布尔值究竟有哪几种?
- 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
- 10.如何将程序的结果展示给用户或保存下来?
- 11.CSV 文件怎么读怎么写才方便?
- 12.列表是什么,如何创建和访问它?
- 13.列表的修改操作,有哪些方法?
- 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
- 15.判断语句:如何让程序根据条件做不同的事?
- 16.for 循环如何遍历序列中的元素?
- 17.while 循环什么时候才会停?
- 18.while 循环的结束条件,你写对了吗?
- 19.循环中途想提前结束,怎么办?
- 20.`break` 和 `continue` 到底有什么区别?
- 21.列表推导式如何让代码更简洁高效?
- 22.字符串怎么定义、拼接和操作?
- 23.元组:为什么定义单个元素时要加逗号?
- 24.集合(set)怎么用?如何快速去重和做集合运算?
- 25.字典是什么,为什么比列表更方便?
- 26.字典的增删改查与遍历,如何避免 KeyError?
- 27.函数里的变量,为什么有的能用有的不能用?
- 28.在函数内部修改全局变量,为什么有时不生效?
- 29.函数里能修改全局变量吗?返回值怎么用?
- 30.匿名函数:如何用 lambda 快速定义简单函数?
- 31.面向对象编程是什么,为什么需要它?
- 32.类中的方法和属性到底怎么定义和使用?
- 33.如何控制对对象内部属性和方法的访问?
- 34.异常发生时,程序会怎样继续执行?
- 35.如何组织代码:包和模块
- 36.`if __name__ == '__main__'` 到底有什么用?
- 37.如何用 IDE 的 Debug 功能排查程序错误?
- 38.Matplotlib 绘图的第一步该做什么?
- 39.Figure 是什么,如何设置图形尺寸?
- 40.如何自定义 Matplotlib 的坐标轴?
- 41.如何为图表添加图例,让不同曲线一目了然?
- 42.饼图怎么画才能直观展示数据占比?
- 43.如何用 Matplotlib 绘制散点图?
- 44.柱状图怎么画?
- 45.如何使用 Matplotlib 绘制等高线图?
- 46.如何在 Matplotlib 中绘制子图?
- 47.zip 函数如何把多个列表“打包”在一起?
- 48.如何给可迭代对象加上索引?
- 49.random 模块如何生成随机数?
- 50.math 模块怎么用?
- 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'?,这其实是一个快速查看可用选项的方法。
📝 动手练一练
- 修改图例标签:将本节第一个示例中的图例标签从“线性函数 (y=2x+1)”和“平方函数 (y=x²)”改为更简洁的“Line 1”和“Line 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 参数拼写错误,如写成 lable | AttributeError: Line2D.set() got an unexpected keyword argument 'lable' | plot 会把未知关键字原样传给线对象,拼写错误会直接报错,而不是被静默忽略。 | 检查拼写,确保是 label。 |
小结
- 图例(Legend) 是图表中用于说明不同数据系列含义的标识框。
- 为曲线添加图例需要两步:在
plt.plot()中使用label参数命名曲线;调用plt.legend()显示图例。 plt.legend()的loc参数用于控制图例位置,常用值有'upper right'(右上)、'upper left'(左上)、'best'(最佳)等。- 如果图表未显示图例,首先检查:①
plot时是否设置了label;② 是否调用了plt.legend()。 - 图例的位置应避免遮挡关键数据点,通常使用
'best'或手动调整到空白区域。
📋 行动清单
- 运行本节的所有示例代码,确认图例能正常显示。
- 将
loc参数从'upper right'依次改为'lower left','center','right',运行并观察图例位置的变化。 - 尝试在一张图上绘制三条不同颜色的水平线,并为它们分别设置有意义的
label(例如“及格线”、“良好线”、“优秀线”),然后添加图例。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第5章代码包:Legend(含1 个 Notebook)ZIP · 14KB