图例(Legend)和标题(Title)是图表中不可或缺的元素,它们帮助读者理解图表所表达的信息。 本章将详细介绍如何在 Matplotlib 中添加和定制标题、图例,以及如何通过文本注释增强图表的可读性。
使用 plt.title() 或面向对象方式 ax.set_title() 为图表添加标题:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# pyplot 方式
plt.plot(x, y)
plt.title('正弦函数曲线', fontsize=16, color='navy', loc='left')
plt.show()
# 面向对象方式
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('正弦函数曲线', fontsize=16, color='navy', loc='center')
plt.show()
loc 参数可设置标题位置:'left', 'center', 'right'。使用 fig.suptitle() 为整个图形添加一个总标题:
fig, axes = plt.subplots(2, 2, figsize=(8,6))
fig.suptitle('多图对比:三角函数', fontsize=16, y=0.98)
x = np.linspace(0, 2*np.pi, 100)
axes[0,0].plot(x, np.sin(x))
axes[0,0].set_title('sin(x)')
axes[0,1].plot(x, np.cos(x))
axes[0,1].set_title('cos(x)')
axes[1,0].plot(x, np.tan(x))
axes[1,0].set_ylim(-5,5)
axes[1,0].set_title('tan(x)')
axes[1,1].plot(x, np.sin(2*x))
axes[1,1].set_title('sin(2x)')
plt.tight_layout()
plt.show()
y 参数可以调整总标题的垂直位置。在绘制时指定 label 参数,然后调用 plt.legend() 显示图例:
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend() # 自动添加图例
plt.title('带图例的图表')
plt.show()
label 的内容自动生成。loc 参数可以控制图例的位置:
| 位置代码 | 说明 |
|---|---|
| 'best' | 自动选择最佳位置(默认) |
| 'upper right' | 右上角 |
| 'upper left' | 左上角 |
| 'lower left' | 左下角 |
| 'lower right' | 右下角 |
| 'center' | 中心 |
| 'upper center' | 上部居中 |
| 等等 | ... |
plt.plot(x, np.sin(x), label='sin')
plt.plot(x, np.cos(x), label='cos')
plt.legend(loc='upper left', fontsize=12)
plt.title('图例位置:左上')
plt.show()
通过 frameon, shadow, fancybox 等参数定制图例边框:
plt.plot(x, np.sin(x), label='sin')
plt.plot(x, np.cos(x), label='cos')
plt.legend(loc='best', frameon=True, shadow=True, fancybox=True,
framealpha=0.7, edgecolor='red', facecolor='lightyellow')
plt.title('定制图例样式')
plt.show()
framealpha 控制透明度,fancybox 启用圆角。使用 ncol 参数将图例分成多列,适合图例项较多时:
for i in range(1,6):
plt.plot(x, np.sin(i*x), label=f'sin({i}x)')
plt.legend(ncol=3, loc='upper center', bbox_to_anchor=(0.5, -0.05))
plt.title('多列图例')
plt.tight_layout()
plt.show()
bbox_to_anchor 配合 loc 可精确定位图例。使用 title 参数为图例添加标题:
plt.plot(x, np.sin(x), label='sin')
plt.plot(x, np.cos(x), label='cos')
plt.legend(title='三角函数', title_fontsize=12)
plt.title('带标题的图例')
plt.show()
有时需要手动创建图例句柄,例如为图像或特殊元素添加图例:
from matplotlib.patches import Patch
from matplotlib.lines import Line2D
# 创建自定义句柄
legend_elements = [Line2D([0], [0], color='b', lw=2, label='折线'),
Line2D([0], [0], marker='o', color='w', label='散点',
markerfacecolor='r', markersize=10),
Patch(facecolor='orange', alpha=0.5, label='区域')]
plt.figure()
plt.legend(handles=legend_elements, loc='center')
plt.title('自定义图例')
plt.show()
Line2D 和 Patch 创建自定义图例项。如果不想让某些元素出现在图例中,可以不设置 label 或设置 label='_nolegend_':
plt.plot(x, np.sin(x), label='sin')
plt.plot(x, np.cos(x)) # 无 label,不会出现在图例
plt.plot(x, -np.sin(x), label='_nolegend_') # 也不会出现
plt.legend()
plt.title('部分元素隐藏图例')
plt.show()
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-0.1*x)
fig, ax = plt.subplots(figsize=(10, 6))
# 绘制三条曲线
ax.plot(x, y1, 'b-', linewidth=2, label='sin(x)')
ax.plot(x, y2, 'r--', linewidth=2, label='cos(x)')
ax.plot(x, y3, 'g-.', linewidth=2, label='damped sin')
# 添加标题和标签
ax.set_title('三角函数与阻尼振荡', fontsize=16, fontweight='bold', pad=20)
ax.set_xlabel('x (rad)', fontsize=12)
ax.set_ylabel('y', fontsize=12)
# 添加图例
ax.legend(loc='upper right', fontsize=11, frameon=True, shadow=True,
fancybox=True, title='曲线类型', title_fontsize=12)
# 添加网格
ax.grid(True, alpha=0.3)
# 设置坐标轴范围
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1.5, 1.5)
plt.tight_layout()
plt.show()
使用 savefig() 保存包含图例和标题的图表:
plt.savefig('legend_title_example.png', dpi=300, bbox_inches='tight')
图例和标题是图表中传递信息的重要元素,掌握它们的定制技巧能让你的图表更加清晰和专业。下一章我们将学习如何进一步美化图表——样式与颜色。