图表修饰:图例与标题

图例(Legend)和标题(Title)是图表中不可或缺的元素,它们帮助读者理解图表所表达的信息。 本章将详细介绍如何在 Matplotlib 中添加和定制标题、图例,以及如何通过文本注释增强图表的可读性。

📌 1. 添加标题

使用 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'。

🔖 2. 子图总标题 (suptitle)

使用 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 参数可以调整总标题的垂直位置。

📖 3. 添加图例

在绘制时指定 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 的内容自动生成。

📍 4. 图例位置

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

🎨 5. 图例样式定制

通过 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 启用圆角。

📑 6. 图例多列显示

使用 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 可精确定位图例。

📛 7. 图例标题

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

✋ 8. 手动创建图例句柄

有时需要手动创建图例句柄,例如为图像或特殊元素添加图例:

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()
✔️ 使用 Line2DPatch 创建自定义图例项。

🙈 9. 隐藏部分元素的图例

如果不想让某些元素出现在图例中,可以不设置 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()

🏆 10. 综合示例:高质量图表

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()
✔️ 综合运用了标题、图例、网格等元素。

💾 11. 保存图表

使用 savefig() 保存包含图例和标题的图表:

plt.savefig('legend_title_example.png', dpi=300, bbox_inches='tight')

图例和标题是图表中传递信息的重要元素,掌握它们的定制技巧能让你的图表更加清晰和专业。下一章我们将学习如何进一步美化图表——样式与颜色。