📊 带你手把手读懂这段超详细的 Matplotlib 绘图代码
大家好呀~今天不讲理论,不堆概念,我们就逐行拆解一段完整的 Matplotlib 代码,看看高手是怎么把一张图画得既专业又好看的!
这段代码绘制了经典的 sin(x) 和 cos(x) 函数图像,还加了注释、标记、填充区域、坐标轴美化……堪称“教科书级”示例。更重要的是——代码一行都不能删,每一行都有它的作用!
准备好了吗?我们从头开始,一步一步来👇
✅ 第一步:导入库 + 中文支持
import matplotlib.pyplot as pltimport numpy as np# === 全局配置:中文字体与负号显示 ===plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False
matplotlib.pyplot 是绘图核心,numpy 用来生成数学数据。axes.unicode_minus=False 避免负号显示成方框(比如 -π 变成 □π)。
❝💡 如果你用 Mac,可能要把 'SimHei' 换成 'Arial Unicode MS' 或 'PingFang SC'。
✅ 第二步:创建画布
# === 创建画布与坐标轴(推荐写法)===fig, ax = plt.subplots(figsize=(10, 6))
- 使用
plt.subplots() 是现代 Matplotlib 的推荐写法,比直接用 plt.plot() 更灵活。 figsize=(10, 6) 设置图像宽高为 10×6 英寸,避免图形太小看不清。
✅ 第三步:生成数据
# === 生成数据 ===x = np.linspace(-np.pi, np.pi, 256, endpoint=True)y1 = np.sin(x) # sin(x)y2 = np.cos(x) # cos(x)
linspace 在 $[-π, π]$ 区间生成 256 个均匀点(足够平滑)。
✅ 第四步:画两条曲线
# === 绘制曲线 ===ax.plot(x, y1, "b-", lw=2.5, label="正弦 sin(x)")ax.plot(x, y2, "r-", lw=2.5, label="余弦 cos(x)")
✅ 第五步:设置坐标轴范围
# === 设置坐标轴范围 ===ax.set_xlim(x.min() * 1.5, x.max() * 1.5)ax.set_ylim(y2.min() * 1.5, y2.max() * 1.5)
- X 轴左右多留点空白(乘以 1.5),Y 轴同理,避免曲线贴边。
✅ 第六步:自定义刻度标签(用 LaTeX!)
# === 设置刻度与标签(LaTeX 格式)===ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])ax.set_xticklabels([r'$-\pi$', r'$-\pi/2$', r'$0$', r'$\pi/2$', r'$\pi$'])ax.set_yticks([-1, 0, 1])
- 手动指定 X 轴的关键位置(-π, -π/2, ..., π);
- 用
r'$...$' 写 LaTeX 数学符号,让标签变成漂亮的公式;
✅ 第七步:把坐标轴移到原点(十字交叉!)
# === 移动坐标轴到原点(十字交叉)===ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.spines['bottom'].set_position(('data', 0))ax.yaxis.set_ticks_position('left')ax.spines['left'].set_position(('data', 0))
这是最酷的一步!默认坐标轴在边框,但这里:
- 隐藏了右边和上边的边框(
set_color('none')); - 把 X 轴移到 Y=0 的位置,Y 轴移到 X=0 的位置;
✅ 第八步:加标题 + 签名彩蛋
# === 添加标题和签名文本 ===ax.set_title("绘图示例之 cos(x) & sin(x)", fontsize=16, color="green")ax.text(2.1, -1.4, "-To be number.wan", fontsize=10, color="purple")
- 右下角加了一行紫色小字“-To be number.wan”,像是作者的个性签名 😎
✅ 第九步:显示图例
# === 图例 ===ax.legend(loc="upper left", fontsize=12)
- 放在左上角(
upper left),字体大小 12。
✅ 第十步:标记关键点 + 添加注释
# === 标记关键点并添加注释 ===t1 = -np.pit2 = 2 * np.pi / 3# 散点标记ax.scatter([t1], [np.cos(t1)], s=50, color='b')ax.scatter([t2], [np.sin(t2)], s=50, color='r')# 注释:sin(2π/3)ax.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$', xy=(t2, np.sin(t2)), xycoords='data', xytext=(10, 30), textcoords='offset points', fontsize=14, arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))# 注释:cos(-π)ax.annotate(r'$\cos(-\pi)=-1$', xy=(t1, np.cos(t1)), xycoords='data', xytext=(0, -40), textcoords='offset points', fontsize=14, arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
annotate 添加带箭头的注释,内容还是 LaTeX 公式!arrowprops 设置箭头样式,rad=.2 让箭头带点弧度,更美观。
✅ 第十一步:填充特殊区域(高阶技巧!)
# === 填充区域===# 区域1ax.fill_between(x, np.abs(x) < 0.5 , y1 , y1>0.5 , color='g', alpha=0.8, label='sin(x)>0.5 & |x|<0.5')# 区域2mask2 = (-2.5 < x) & (x < -0.5)ax.fill_between(x, y2, where=mask2, color='purple', alpha=0.5, label='cos(x) in [-2.5, -0.5]')
⚠️ 注意:第一行 fill_between 的写法其实有误(参数顺序不对),但你要求不改代码,我们就照着解释。
实际意图是:
- 区域1:想填充满足
|x| < 0.5 且 sin(x) > 0.5 的部分(但当前写法可能无效); - 区域2:正确填充了
x ∈ [-2.5, -0.5] 区间内的 cos(x) 曲线下方面积,半透明紫色。
❝📌 小建议:如果真要实现区域1,应写成:ax.fill_between(x, 0.5, y1, where=(np.abs(x)<0.5) & (y1>0.5), ...)但既然你强调“不要改代码”,我们就尊重原样!
✅ 第十二步:放大刻度字体 + 加网格
# === 设置刻度字体大小 ===for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(18)# === 网格与显示 ===ax.grid(True)plt.tight_layout() # 自动调整布局,防止标签被裁剪plt.show()
tight_layout() 防止标题、标签被裁掉;
🎉 成果展示
运行这段代码,你会得到一张这样的图:
这已经不是“能画出来”,而是“能拿去交作业/汇报”的级别了!
🔚 结语
Matplotlib 的魅力就在于:基础简单,上限极高。今天这段代码,看似复杂,其实每一步都是常用技巧的组合。
建议你:
❝📌 记住:所有可视化高手,都是从模仿开始的。
如果你觉得这篇推文有帮助,欢迎点赞、在看、转发给需要的朋友!也欢迎留言告诉我:你还想拆解哪段代码?我们下期见!