在Matplotlib上绘制多个图例
在数据可视化中,图例是不可或缺的一部分。它可以告诉我们每个线条、点或区域表示的含义。但是,在某些情况下,我们可能需要在同一个图中显示多个图例,例如,如果我们想对同一数据集进行多种解释或者想将几个子图合并到一个图中时。在这种情况下,我们可以使用Matplotlib来绘制多个图例。
示例代码
考虑以下情况:我们要在同一个图中显示三个不同颜色的线条,每个线条都有一个与之相关的图例。
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
# 绘图
fig, ax = plt.subplots()
ax.plot(x, y1, 'r', label='sin(x)')
ax.plot(x, y2, 'g', label='cos(x)')
ax.plot(x, y3, 'b', label='tan(x)')
# 添加图例
ax.legend(loc='upper right')
# 展示图形
plt.show()
我们可以看到,上面的代码生成了一个包含三条曲线的图像。每个曲线都有一个与之相关的图例,它们位于图像的右上角。
现在,我们想在同一个图中添加另一个图例,这个图例将显示每个曲线的最大值。
为了实现这一点,我们可以使用legend_elements()
方法来创建一个新的图例。该方法需要指定我们要显示的图例类型,并返回一个元组,其中包含要添加到图例的句柄和标签。之后,我们可以调用legend()
并传递这些句柄和标签来显示新的图例。
以下是添加第二个图例的代码:
# 添加第二个图例
handles, labels = ax.get_legend_handles_labels()
max_handles = []
max_labels = []
for y, label in zip([y1, y2, y3], labels):
max_val = np.max(y)
max_handles.append(ax.axhline(y=max_val, color='gray', linestyle='--', linewidth=1))
max_labels.append('{} ({:.2f})'.format(label, max_val))
ax.legend(handles + max_handles, labels + max_labels, loc='lower left', fontsize=8)
这段代码做了以下事情:
- 调用
ax.get_legend_handles_labels()
方法获取现有的图例句柄和标签。 - 对于每个曲线,计算该曲线的最大值,并使用Matplotlib的
axhline()
方法创建一个水平线句柄,该句柄将显示在添加的新图例中。 - 构造新的句柄和标签列表,该列表包含现有的句柄和标签以及新的句柄和标签。
- 调用
ax.legend()
方法并传递新的句柄和标签。
现在,我们已经成功地在同一个图中显示了两个图例。
结论
在Matplotlib中绘制多个图例可以帮助我们更好地解释图像,并使复杂图像更易于理解。通过使用legend_elements()
方法,我们可以创建新的图例,并将它们添加到原始图例中。