文章标签:#Python #Matplotlib #数据可视化 #数据分析 #AI 人工智能 #零基础学 Python
前言
在人工智能、数据分析、机器学习领域,数据可视化是最核心的呈现方式。Matplotlib 是 Python 中最经典、最稳定、最通用的 2D 绘图库,几乎所有数据分析、AI 训练、论文绘图都会用到。
本文专为零基础小白 打造,从安装→基础绘图→进阶美化→AI 实战→常见问题,全程代码可直接复制运行 ,每一段代码都带详细注释 ,每一张图都已生成并展示,不讲废话、只讲实战,让你快速掌握 Matplotlib 绘图全技能!
一、Matplotlib 基础认知
1.1 什么是 Matplotlib?
Matplotlib 是 Python 的 2D 绘图库,可以绘制:折线图、散点图、柱状图、直方图、饼图、热力图、3D 图、等高线图等。它是数据科学、AI、机器学习、办公自动化必备工具。
1.2 Matplotlib 核心优势
- 免费开源、轻量高效
- 低配电脑可流畅运行
- 语法简单、零基础快速上手
- 高度自定义,可做出论文级图表
- 与 NumPy、Pandas、AI 框架完美兼容
- 支持高清导出 PNG、PDF、SVG
1.3 核心架构(极简理解)
- Figure 画布:整张图的容器
- Axes 坐标系:真正绘图的区域
- Axis 坐标轴:X 轴、Y 轴
- plt.plot():绘图
- plt.show():显示图片
- plt.savefig():保存图片
二、环境安装与基础配置(必看)
2.1 安装命令(无报错版)
bash
运行
pip install matplotlib numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 全局中文配置(解决中文乱码)
python
运行
python
import matplotlib.pyplot as plt
import numpy as np
# -------------------------- 【全局配置】 --------------------------
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
plt.rcParams['axes.unicode_minus'] = False # 负号显示
plt.rcParams['axes.grid'] = True # 默认网格
plt.rcParams['grid.alpha'] = 0.3 # 网格透明度
plt.rcParams['figure.figsize'] = (10, 6) # 画布大小
plt.rcParams['figure.dpi'] = 100 # 画布分辨率
三、基础绘图:5 大核心图表(全代码 + 全注释 + 全运行 + 全图)
3.1 折线图 plt.plot () ------ 趋势展示(最常用)
实战 1:年龄趋势图
python
运行
python
import matplotlib.pyplot as plt
import numpy as np
# 配置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['axes.grid'] = True
plt.rcParams['grid.alpha'] = 0.3
# 数据
ages = ['13岁','14岁','15岁','16岁','17岁','18岁','19岁','20岁','21岁','22岁','23岁','24岁','25岁','26岁','27岁']
values = [1,1,2,4,3,2,3,4,4,5,6,5,4,3,3]
# 创建画布
plt.figure(figsize=(12,6))
# 绘制折线
plt.plot(ages, values, color='#1f77b4', linewidth=2.5, marker='o', markersize=6, label='数值')
# 图表装饰
plt.title('年龄分布趋势折线图', fontsize=16)
plt.xlabel('年龄', fontsize=12)
plt.ylabel('统计数值', fontsize=12)
plt.xticks(rotation=30)
plt.legend()
plt.grid(alpha=0.3)
# 保存 + 显示
plt.tight_layout()
plt.savefig('age_trend.png', dpi=300, bbox_inches='tight')
plt.show()

3.2 双折线对比图(正弦 + 余弦)
python
运行
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成数据
x = np.linspace(0, 10, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 绘图
plt.figure(figsize=(10,6))
plt.plot(x, y_sin, label='sin(x)', color='#1f77b4', linewidth=2)
plt.plot(x, y_cos, label='cos(x)', color='#ff7f0e', linewidth=2, linestyle='--')
# 装饰
plt.title('正弦余弦函数对比曲线', fontsize=14)
plt.xlabel('X轴', fontsize=12)
plt.ylabel('Y轴', fontsize=12)
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('sin_cos.png', dpi=300)
plt.show()

3.3 散点图 plt.scatter () ------ 数据相关性分析
python
运行
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 构造数据
np.random.seed(42)
x = np.linspace(0,10,100)
y = 2 * x + np.random.randn(100) * 2
# 绘制散点图
plt.figure(figsize=(10,6))
plt.scatter(x, y, color='#2ca02c', s=60, alpha=0.7, label='样本点')
# 装饰
plt.title('散点图:X与Y线性关系', fontsize=14)
plt.xlabel('自变量X', fontsize=12)
plt.ylabel('因变量Y', fontsize=12)
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('scatter.png', dpi=300)
plt.show()
生成图形:

3.4 柱状图 plt.bar () ------ 分类数据对比
python
运行
python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 数据
names = ['产品A','产品B','产品C','产品D','产品E']
sales = [45,62,38,75,52]
colors = ['#1f77b4','#ff7f0e','#2ca02c','#d62728','#9467bd']
# 绘图
plt.figure(figsize=(10,6))
bars = plt.bar(names, sales, color=colors)
# 给柱子添加数值
for bar in bars:
h = bar.get_height()
plt.text(bar.get_x()+bar.get_width()/2, h+1, f'{h}', ha='center', fontsize=12)
# 装饰
plt.title('产品销量对比柱状图', fontsize=14)
plt.xlabel('产品类型')
plt.ylabel('销量(件)')
plt.grid(axis='y', alpha=0.3)
plt.savefig('bar_sales.png', dpi=300)
plt.show()
生成图形:

3.5 直方图 plt.hist () ------ 数据分布统计
python
运行
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成正态分布数据
data = np.random.normal(loc=0, scale=1, size=10000)
# 绘图
plt.figure(figsize=(10,6))
plt.hist(data, bins=50, color='#1f77b4', edgecolor='black', alpha=0.7)
# 装饰
plt.title('正态分布直方图(10000样本)', fontsize=14)
plt.xlabel('数值')
plt.ylabel('频数')
plt.grid(alpha=0.3)
plt.savefig('hist.png', dpi=300)
plt.show()

3.6 饼图 plt.pie () ------ 占比分析
python
运行
python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 数据
labels = ['手机端','PC端','平板端','其他']
sizes = [65,22,10,3]
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99']
explode = (0.05,0,0,0)
# 绘图
plt.figure(figsize=(8,8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.title('用户设备使用占比饼图', fontsize=14)
plt.savefig('pie.png', dpi=300)
plt.show()

四、Matplotlib 进阶绘图(AI / 工作必备)
4.1 多子图 subplots(一图多表)
python
运行
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建2行2列子图
fig, axs = plt.subplots(2, 2, figsize=(12,8))
x = np.linspace(0,10,100)
axs[0,0].plot(x, np.sin(x), color='#1f77b4')
axs[0,0].set_title('正弦函数')
axs[0,0].grid(True, alpha=0.3)
axs[0,1].plot(x, np.cos(x), color='#ff7f0e')
axs[0,1].set_title('余弦函数')
axs[0,1].grid(True, alpha=0.3)
axs[1,0].plot(x, np.exp(-x/5), color='#2ca02c')
axs[1,0].set_title('指数衰减')
axs[1,0].grid(True, alpha=0.3)
axs[1,1].plot(x, np.sqrt(x), color='#d62728')
axs[1,1].set_title('平方根函数')
axs[1,1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('subplots.png', dpi=300)
plt.show()

4.2 AI 模型训练曲线(最常用实战)
python
运行
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 模拟训练数据
epochs = np.arange(1,51)
train_loss = 0.8 * np.exp(-epochs/10)
val_loss = 0.9 * np.exp(-epochs/12)
train_acc = 0.5 + 0.48*(1-np.exp(-epochs/8))
val_acc = 0.45 + 0.45*(1-np.exp(-epochs/10))
# 创建双图
fig, (ax1, ax2) = plt.subplots(1,2, figsize=(14,5))
ax1.plot(epochs, train_loss, label='训练损失', linewidth=2)
ax1.plot(epochs, val_loss, label='验证损失', linewidth=2, linestyle='--')
ax1.set_title('损失曲线', fontsize=12)
ax1.set_xlabel('Epoch', fontsize=10)
ax1.set_ylabel('Loss', fontsize=10)
ax1.legend()
ax1.grid(True, alpha=0.3)
ax2.plot(epochs, train_acc, label='训练准确率', color='green', linewidth=2)
ax2.plot(epochs, val_acc, label='验证准确率', color='red', linewidth=2, linestyle='--')
ax2.set_title('准确率曲线', fontsize=12)
ax2.set_xlabel('Epoch', fontsize=10)
ax2.set_ylabel('Accuracy', fontsize=10)
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.suptitle('AI模型训练可视化', fontsize=14)
plt.tight_layout()
plt.savefig('ai_training.png', dpi=300)
plt.show()

五、Matplotlib 高级美化技巧
5.1 线条样式设置
python
运行
plt.plot(x,y, linestyle='-') # 实线
plt.plot(x,y, linestyle='--') # 虚线
plt.plot(x,y, linestyle=':') # 点线
plt.plot(x,y, marker='o') # 圆点
plt.plot(x,y, marker='s') # 方块
5.2 颜色设置
python
运行
color='red'
color='#1f77b4'
color='#ff7f0e'
5.3 高清导出
python
运行
plt.savefig('图.png', dpi=300, bbox_inches='tight')
5.4 画布大小
python
运行
plt.figure(figsize=(10,6))
六、零基础常见问题(100% 解决)
6.1 中文显示方框?
python
运行
plt.rcParams['font.sans-serif'] = ['SimHei']
6.2 图片不显示?
python
运行
plt.show()
6.3 保存图片空白?
必须 先保存,后显示:
python
运行
plt.savefig('a.png')
plt.show()
6.4 标签重叠?
python
运行
plt.xticks(rotation=30)
七、总结(超完整版)
本文从 零基础 带你掌握:
- Matplotlib 安装与中文配置
- 5 大基础图表(折线 / 散点 / 柱状 / 直方图 / 饼图)
- 多子图、AI 训练曲线、高清导出
- 商务风格、论文风格、AI 风格绘图
- 所有代码 可直接运行、无报错、全注释
- 所有图表 已实际生成、清晰美观
只要跟着本文练习 3 天,你就能独立完成:✅ 数据分析图表✅ AI 模型训练曲线✅ 商务报表图表✅ 论文高清插图✅ 自动化办公绘图