news 2026/6/9 22:17:49

Python数据分析:Matplotlib 绘图练习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python数据分析:Matplotlib 绘图练习

📊 带你手把手读懂这段超详细的 Matplotlib 绘图代码

大家好呀~今天不讲理论,不堆概念,我们就逐行拆解一段完整的 Matplotlib 代码,看看高手是怎么把一张图画得既专业又好看的!

这段代码绘制了经典的sin(x)cos(x)函数图像,还加了注释、标记、填充区域、坐标轴美化……堪称“教科书级”示例。
更重要的是——代码一行都不能删,每一行都有它的作用!

准备好了吗?我们从头开始,一步一步来👇


✅ 第一步:导入库 + 中文支持

import matplotlib.pyplot as plt import numpy as np # === 全局配置:中文字体与负号显示 === plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
  • matplotlib.pyplot是绘图核心,numpy用来生成数学数据。

  • 下面两行是解决中文显示问题的经典配置

    • SimHei(黑体)让图中的中文正常显示;

    • 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 个均匀点(足够平滑)。

  • y1y2分别是正弦和余弦函数值。


✅ 第四步:画两条曲线

# === 绘制曲线 === ax.plot(x, y1, "b-", lw=2.5, label="正弦 sin(x)") ax.plot(x, y2, "r-", lw=2.5, label="余弦 cos(x)")
  • "b-"表示蓝色实线,"r-"是红色实线;

  • lw=2.5让线条更粗,视觉效果更好;

  • label用于后面生成图例(legend)。


✅ 第五步:设置坐标轴范围

# === 设置坐标轴范围 === 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 数学符号,让标签变成漂亮的公式;

  • Y 轴只标 -1, 0, 1,简洁明了。


✅ 第七步:把坐标轴移到原点(十字交叉!)

# === 移动坐标轴到原点(十字交叉)=== 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)
  • 根据前面label自动生成图例;

  • 放在左上角(upper left),字体大小 12。


✅ 第十步:标记关键点 + 添加注释

# === 标记关键点并添加注释 === t1 = -np.pi t2 = 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"))
  • scatter在特定点画小圆点;

  • annotate添加带箭头的注释,内容还是 LaTeX 公式!

  • xytext控制注释文本的位置偏移;

  • arrowprops设置箭头样式,rad=.2让箭头带点弧度,更美观。


✅ 第十一步:填充特殊区域(高阶技巧!)

# === 填充区域=== # 区域1 ax.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') # 区域2 mask2 = (-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.5sin(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()
  • 刻度数字放大到 18 号,投影/截图都清晰;

  • grid(True)显示背景网格,方便读数;

  • tight_layout()防止标题、标签被裁掉;

  • 最后plt.show()弹出图像!


🎉 成果展示

运行这段代码,你会得到一张这样的图:

  • 十字坐标轴穿过原点;

  • 正弦(蓝)、余弦(红)曲线清晰标注;

  • 关键点带公式注释;

  • 有填充区域、网格、图例、中文标题;

  • 连作者签名都有!

这已经不是“能画出来”,而是“能拿去交作业/汇报”的级别了!


🔚 结语

Matplotlib 的魅力就在于:基础简单,上限极高
今天这段代码,看似复杂,其实每一步都是常用技巧的组合。

建议你:

  1. 复制代码运行一遍

  2. 逐行注释/取消注释,看效果变化;

  3. 尝试修改颜色、范围、公式,做出自己的版本!

📌记住:所有可视化高手,都是从模仿开始的。

如果你觉得这篇推文有帮助,欢迎点赞、在看、转发给需要的朋友!
也欢迎留言告诉我:你还想拆解哪段代码?我们下期见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:41:40

蓝易云 :Docker创建Consul并添加权限控制

下面给你一套可直接落地的方案&#xff1a;用 Docker Compose 启动 Consul 单节点&#xff0c;并开启 <span style"color:#e53935">ACL 权限控制</span>&#xff08;默认拒绝&#xff0c;按需放行&#xff09;。目标是&#xff1a;最小暴露面、可审计、可…

作者头像 李华
网站建设 2026/6/10 11:43:08

多编组列车仿真:基于Fluent与Simpack的奇妙联动

多编组列车仿真&#xff0c;车体加载fluent里导出的气动力进行仿真。 利用脚本建立fluent里的导出的气动力数据和simpack力元的接口进行快速的数据更新 最近在搞多编组列车仿真&#xff0c;过程里涉及到利用Fluent导出的气动力在其他软件里进行进一步仿真&#xff0c;这里就不…

作者头像 李华
网站建设 2026/6/9 23:57:03

导师推荐10个降AIGC网站,千笔帮你轻松降AI率

AI降重工具&#xff0c;让论文更自然更安心 在当前高校学术要求日益严格的背景下&#xff0c;越来越多的本科生开始关注论文的AIGC率和查重率问题。随着AI写作工具的广泛应用&#xff0c;如何有效降低AI痕迹、提升论文原创性&#xff0c;成为许多学生面临的重要课题。而AI降重工…

作者头像 李华
网站建设 2026/6/4 6:35:09

【C / C++】带你系统的认识 string

【C / C】带你系统的认识 string 从零到精通&#xff0c;一次性把 string 搞明白&#xff01;&#xff08;2026 年最新视角&#xff0c;涵盖 C 和 C 所有常见用法&#xff09; C 和 C 里&#xff0c;string 有三种完全不同的“身份”&#xff0c;很多人混着用才踩坑。我们按难…

作者头像 李华
网站建设 2026/6/10 14:24:15

多模态RAG不是“加个图”那么简单:从解析到生成的全流程拆解

前言 各位码农兄弟姐妹们&#xff0c;今天咱们不聊框架选型&#xff0c;也不卷大模型参数&#xff0c;来唠点实在的——多模态RAG。你可能已经用纯文本RAG搞定了客服问答、知识库检索&#xff0c;甚至写了个小助手能自动回答公司制度问题。但某天产品经理突然甩来一张产品架构…

作者头像 李华
网站建设 2026/6/10 14:28:25

大数据深度学习|计算机毕设项目|计算机毕设答辩|基于Django的京东智能家电销量数据分析系统设计与实现

一、项目介绍 随着人们生活水平的提高和智能家电市场的快速发展&#xff0c;智能家电用品的销售情况分析与可视化显得尤为重要。本文针对智能家电用品市场&#xff0c;基于Python技术&#xff0c;对销售数据进行挖掘与分析&#xff0c;并以可视化形式展示分析结果&#xff0c;旨…

作者头像 李华