当前位置: 首页 > news >正文

Python数据分析可视化:Matplotlib实训

📈 实训揭秘:用 Matplotlib 画出“会说话”的函数图!

你以为数学公式只会躺在课本里?
不!它们也能在屏幕上“跳舞”——只要你会用 Matplotlib!

今天咱们来玩点“硬核”的:
看懂一张图,写出一段代码,把抽象的数学函数变成有注释、有箭头、有水印的精美图表!

这不仅是练习,更是对 Matplotlib 核心功能的全面实战演练。
别急着划走,看完你也能画出“老板看了想收藏”的图!


🎯 实训目标

给定如下两个图像样式,要求写出对应的绘图代码:


(左图:高频率正弦波 + 局部最大值标注;右图:标准正弦曲线 + 注释与水印)

我们不仅要复现图形,更要理解每一行代码背后的“设计意图”。


✅ 第一步:导入库 & 设置字体

import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体显示中文 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 %matplotlib inline

💡 小贴士:如果你的图中出现“方框”或乱码,大概率是字体没设置好。SimHei是 Windows 上常用的中文字体,Mac 用户可以用'PingFang SC''STHeiti'


🖼️ 第二步:创建画布和子图

fig = plt.figure() ax1 = fig.add_subplot(121) # 左边图:1行2列第1个 ax2 = fig.add_subplot(122) # 右边图:1行2列第2个

🌰 生活类比:就像你在做 PPT,一页放两个小图,左边讲“快节奏”,右边讲“慢工出细活”。


🌀 图一:y = sin(2πt) —— 高频振荡的“心跳”

t = np.arange(0.0, 5, 0.01) # 时间从0到5,步长0.01 s = np.sin(2 * np.pi * t) # 计算sin(2πt) ax1.plot(t, s, lw=2) # 绘制曲线,线宽为2

🔍 添加局部最大值标注

bbox = dict(boxstyle='round', fc='white') # 白色圆角框 plt.annotate('local max', xy=(2.3, 1), # 箭头指向点 xytext=(3, 1.5), # 文字位置 arrowprops=dict(facecolor='black', edgecolor='red', headwidth=7, width=2), bbox=bbox)

✅ 解读:

  • xy:箭头起点(即曲线上某点)

  • xytext:文本框位置

  • arrowprops:控制箭头样式(黑色填充、红色边框、粗箭头)

  • bbox:文本框样式(白色背景、圆角)

📝 添加标题与坐标轴标签

ax1.set_ylabel('Y', fontsize=12) ax1.set_xlabel('X', fontsize=12) ax1.set_ylim(-2, 2) # y轴范围

✍️ 手写公式说明

ax1.text(1, 1.2, 'max', fontsize=18) ax1.text(1.2, -1.8, '$ y = sin(2 * np.pi * t) $', bbox=bbox, rotation=10, alpha=0.8)

🌟 注意:

  • $...$表示 LaTeX 数学公式

  • rotation=10:让文字倾斜一点,更自然

  • alpha=0.8:透明度,避免遮挡曲线


🌊 图二:y = sin(x) —— 平稳优雅的“呼吸”

x = np.linspace(0, 10, 200) # 0到10之间生成200个点 y = np.sin(x) ax2.plot(x, y, linestyle='-.', color='purple') # 虚点线,紫色

🎨 颜色建议:purple很适合“神秘感”场景,比如宇宙、哲学、深夜加班……

🎯 添加关键点注释:“Here I am”

ax2.annotate(text='Here I am', xy=(4.8, np.sin(4.8)), # 指向最低点 xytext=(3.7, -0.2), weight='bold', color='k', arrowprops=dict(arrowstyle='-|>', connectionstyle='arc3', color='red'), bbox=dict(boxstyle='round', pad=0.5, fc='yellow', ec='k', lw=1), alpha=0.8)

🧠 重点解析:

  • arrowstyle='-|>':箭头是实线加竖线结尾(像“靶心”)

  • connectionstyle='arc3':弯曲路径,更美观

  • pad=0.5:增加文本框内边距

  • fc='yellow':黄色背景,突出显示

⚙️ 设置坐标轴范围

ax2.set_ylim(-1.5, 1.5) ax2.set_xlim(0, 10)

🛠️ 这样可以让图像比例协调,不会“挤”或“空”。


🎨 最后一步:美化与水印

🔹 添加网格线

ax2.grid(ls=":", color='gray', alpha=0.5)

✅ 点状虚线网格,轻盈不抢戏,提升可读性。

🔹 添加带方框的水印

ax2.text(4.5, 1, 'NWNNU', fontsize=15, alpha=0.3, color='gray', bbox=dict(fc='white', boxstyle='round', edgecolor='gray', alpha=0.3))

🌐 水印技巧:

  • alpha=0.3:半透明,不影响主体

  • fc='white':白色背景,防止文字被线条遮挡

  • boxstyle='round':圆角边框,柔和不刺眼


🎉 完整代码汇总(直接复制可用)

import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False %matplotlib inline fig = plt.figure() ax1 = fig.add_subplot(121) t = np.arange(0.0, 5, 0.01) s = np.sin(2 * np.pi * t) ax1.plot(t, s, lw=2) bbox = dict(boxstyle='round', fc='white') plt.annotate('local max', xy=(2.3, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', edgecolor='red', headwidth=7, width=2), bbox=bbox) ax1.set_ylabel('Y', fontsize=12) ax1.set_xlabel('X', fontsize=12) ax1.set_ylim(-2, 2) ax1.text(1, 1.2, 'max', fontsize=18) ax1.text(1.2, -1.8, '$ y = sin(2 * np.pi * t) $', bbox=bbox, rotation=10, alpha=0.8) ax2 = fig.add_subplot(122) x = np.linspace(0, 10, 200) y = np.sin(x) ax2.plot(x, y, linestyle='-.', color='purple') ax2.annotate(text='Here I am', xy=(4.8, np.sin(4.8)), xytext=(3.7, -0.2), weight='bold', color='k', arrowprops=dict(arrowstyle='-|>', connectionstyle='arc3', color='red'), bbox=dict(boxstyle='round', pad=0.5, fc='yellow', ec='k', lw=1), alpha=0.8) ax2.set_ylim(-1.5, 1.5) ax2.set_xlim(0, 10) bbox = dict(boxstyle='round', ec='red', fc='white') ax2.text(6, -1.9, '$ y = sin(x) $', bbox=dict(boxstyle='square', facecolor='white', ec='black')) ax2.grid(ls=":", color='gray', alpha=0.5) ax2.text(4.5, 1, 'NWNNU', fontsize=15, alpha=0.3, color='gray', bbox=dict(fc='white', boxstyle='round', edgecolor='gray', alpha=0.3)) plt.show()

🧩 学到了什么?

功能

关键词

多图并排

add_subplot(121)

/122

标注文字

annotate()

箭头样式

arrowprops

,arrowstyle

文本框

bbox

,boxstyle

公式渲染

$...$

中文支持

SimHei

,unicode_minus=False

水印

text()

+ 半透明 + 边框


🚀 结语:你的数据,也可以这么“会说话”

从一条简单的正弦曲线,到充满细节的标注与水印,
Matplotlib 的强大之处正在于——它不只是画图,更是讲故事

下次当你看到一个“看不懂但很酷”的图表时,
不妨想想:
“这个图背后,是不是也藏着一行行精心设计的代码?”


📌关注我们,下期带你用 Seaborn 一键生成“论文级”图表!

💬 如果你觉得这篇实训解析对你有帮助,欢迎点赞+转发,让更多同学少走弯路!

http://www.jsqmd.com/news/315107/

相关文章:

  • GLM-4.7-Flash效果展示:4096上下文下多轮会议纪要精准提炼
  • 腾讯混元MT1.5-1.8B实战对比:WMT25测试集表现超同尺寸模型30%
  • ccmusic-database应用场景:数字音乐馆元数据自动打标、流派归档系统建设
  • Qwen3-4B Instruct-2507详细步骤:GPU显存监控+推理吞吐量压测方法
  • 超详细教程:YOLOv9镜像的使用方法
  • OFA视觉问答开源大模型:iic/ofa_visual-question-answering_pretrain_large_en深度解析
  • Z-Image Turbo快速上手:显存优化下的小GPU运行方案
  • 直播字幕生成可行吗?Fun-ASR流式识别尝试
  • Qwen2.5-0.5B实战:表格理解与数据提取完整流程
  • WuliArt Qwen-Image Turbo参数详解:VAE分块编码、显存卸载与分辨率控制
  • Clawdbot部署案例:Qwen3:32B代理网关在离线政务大厅中无网环境下的本地化部署
  • 新手也能做配音!IndexTTS 2.0零样本克隆实测分享
  • 技术文档也是产品力!看Heygem如何赢得流量
  • Qwen3-4B temperature与top_k联动调优:生成质量提升法
  • all-MiniLM-L6-v2部署教程:Ollama + Nginx反向代理 + HTTPS安全访问
  • ClawdBot实际作品:OCR识别菜单图片→翻译成日语→生成点餐建议
  • vTaskDelay的时间精度影响因素:全面讲解系统配置依赖
  • RexUniNLU效果展示:无需微调,中文实体抽取与情感分类惊艳实测
  • DeepSeek-R1内存泄漏?性能监控部署优化案例
  • VibeVoice-TTS性能表现:A100上2倍速生成90分钟语音
  • 如何用VibeVoice打造专业级播客?实战应用分享
  • 保存路径找不到?fft npainting lama输出文件定位技巧
  • ChatGLM3-6B在企业知识库中的应用:长文本分析落地案例
  • StructBERT中文语义系统性能实测:毫秒级响应+万条/分钟批量处理能力
  • 无需PS也能做证件照?AI工坊全自动流程部署实战案例
  • JupyterLab里的一键奇迹:3步跑通微软TTS大模型
  • QWEN-AUDIO部署案例:数字人直播系统集成QWEN-AUDIO实时语音驱动方案
  • YOLOv12官版镜像对比YOLOv8:谁更适合工业部署
  • EagleEye开源大模型教程:本地化部署DAMO-YOLO TinyNAS完整指南
  • SeqGPT-560M开源模型价值:规避SaaS服务数据出境合规风险的本地化方案