转自:

【Python学习】Matplotlib 入门到精通详细教程-CSDN博客

1. Matplotlib 简介与环境准备
1.1 什么是 Matplotlib?

        Matplotlib 是一个开源的数据可视化 库,诞生于 2003 年,初衷是为 Python 提供类似 MATLAB 的绘图能力。它的核心优势的是:

  • 支持多种图表类型,从基础的折线图到复杂的3D图、热力图,满足不同场景需求;
  • 高度可定制,图表的每一个细节(字体、颜色、线条、标签)都可手动调整;
  • 与 NumPy、Pandas 无缝联动,可直接读取数组、DataFrame 数据绘图;
  • 支持多种输出格式(图片、PDF、SVG 等),可用于报告、论文、网页展示。

1.2 环境安装(一行命令)

        Matplotlib 可通过 pip 直接安装,建议同时安装 NumPy、Pandas(后续实战会用到):

# 单独安装 Matplotlib 
pip install matplotlib 

# 推荐:安装 Matplotlib + NumPy + Pandas(数据可视化套装) 
pip install matplotlib numpy pandas

1.3 导入方式(固定写法)

        Matplotlib 最常用的是 pyplot 模块,行业通用简写为 plt,导入方式固定:

# 后续绘图会用到,提前导入 import pandas as pd # 实战案例用到,提前导入
import matplotlib.pyplot as plt import numpy as np 

1.4 第一个 Matplotlib 图表(入门测试)

        运行以下代码,验证环境是否正常,同时熟悉最基础的绘图流程:

# 1. 准备数据(NumPy 数组) 
x = np.array([1, 2, 3, 4, 5]) 
y = np.array([2, 4, 6, 8, 10]) 
# 2. 绘制折线图 
plt.plot(x, y) 
# 3. 显示图表
 plt.show()

        运行后会弹出一个包含折线图的窗口,说明环境安装成功,入门第一步完成。

2. Matplotlib 核心结构(必懂)

        Matplotlib 的绘图核心是「层级结构」,理解这一结构,才能灵活自定义图表,避免后续踩坑。核心层级分为3层(从底层到顶层):

  • Figure(画布):整个图表的“容器”,所有元素(坐标轴、图表、标签)都在画布上。可以理解为“一张白纸”。
  • Axes(坐标轴/子图):画布上的“绘图区域”,一个画布可以有多个 Axes(即多子图)。可以理解为“白纸上的一个画框”,图表必须绘制在 Axes 上。
  • Artist(图表元素):绘制在 Axes 上的具体内容,包括线条、点、标签、图例、网格等,是图表的“细节”。

核心结构示例(直观理解)

# 1. 创建画布(Figure) 
fig = plt.figure(figsize=(8, 5)) # figsize:画布尺寸(宽,高),单位:英寸 
# 2. 在画布上创建 Axes(子图) 
ax = fig.add_subplot(1, 1, 1) # 1行1列,第1个子图(默认写法,可简化) 
# 3. 在 Axes 上绘制图表(Artist) 
ax.plot([1,2,3], [4,5,6], label='折线图') # 绘制折线,添加标签(用于图例) 
# 4. 给 Axes 添加细节(Artist) ax.set_title('Matplotlib 核心结构示例') # 标题 ax.set_xlabel('X 轴标签') # X轴标签 
ax.set_ylabel('Y 轴标签') # Y轴标签 
ax.legend() # 显示图例 
ax.grid(True) # 显示网格 
# 5. 显示图表 
plt.show()

说明:后续入门阶段,我们会用更简洁的 plt.xxx() 写法(封装了 Figure 和 Axes),但进阶和精通阶段,必须掌握 ax.xxx() 写法(更灵活,适合复杂图表)。

3. 入门:基础图表绘制(6种常用图表)

        入门阶段,重点掌握 6 种高频基础图表,掌握“数据准备→绘制→添加细节→显示”的固定流程,所有代码可直接复制运行。

3.1 折线图(plot)—— 最常用

        用途:展示数据随时间/变量的变化趋势(如股价、气温、销量变化)。

# 1. 准备数据(模拟股价变化) 
x = np.arange(1, 11) # X轴:1~10天 
y = np.array([12, 15, 13, 18, 16, 20, 19, 22, 25, 23]) # Y轴:股价 
# 2. 绘制折线图(设置线条颜色、样式、宽度) 
plt.plot(x, y, color='red', linestyle='-', linewidth=2, marker='o', label='股价') 
# 3. 添加细节 plt.title('10天股价变化趋势', fontsize=14) # 标题及字体大小 
plt.xlabel('天数', fontsize=12) # X轴标签 
plt.ylabel('股价(元)', fontsize=12) # Y轴标签 
plt.legend() # 显示图例(需在plot中设置label) 
plt.grid(True, alpha=0.3) # 网格,alpha:透明度(0~1) 
plt.xticks(x) # X轴刻度:显示1~10的所有整数 
# 4. 显示图表 
plt.show()

关键参数说明:

  • color:线条颜色(red、blue、green、#FF0000 十六进制色值);
  • linestyle:线条样式(- 实线、-- 虚线、: 点线、-. 点划线);
  • linewidth:线条宽度;
  • marker:数据点标记(o 圆形、s 正方形、^ 三角形、* 星号)。

3.2 柱状图(bar/barh)—— 对比数据

        用途对比多个类别数据的差异(如不同产品销量、不同班级分数、不同地区人口)。

# 1. 准备数据(模拟不同产品销量) 
products = ['产品A', '产品B', '产品C', '产品D'] 
sales = [500, 720, 380, 650] 
# 2. 绘制柱状图(垂直柱状图:bar;水平柱状图:barh) 
plt.bar(products, sales, color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'], width=0.6) 
# 3. 添加细节(给每个柱子添加数值标签) 
for i, v in enumerate(sales): 
    plt.text(i, v + 10, str(v), ha='center', fontsize=10) # 数值标签位置、对齐方式 plt.title('不同产品销量对比', fontsize=14) 
plt.xlabel('产品名称', fontsize=12) 
plt.ylabel('销量(件)', fontsize=12) 
plt.grid(True, axis='y', alpha=0.3) # 只显示Y轴网格 
plt.show()

补充:水平柱状图用 plt.barh(products, sales),适合类别名称较长的场景。

3.3 散点图(scatter)—— 展示相关性

        用途:展示两个变量之间的相关性(如身高与体重、学习时间与成绩、广告投入与销量)。

# 1. 准备数据(模拟学习时间与成绩的关系) 
study_time = np.random.randint(1, 10, 50) # 50个学生的学习时间(1~9小时) 
score = study_time * 8 + np.random.randn(50) * 3 # 成绩=学习时间*8 + 随机波动 
# 2. 绘制散点图(设置点的大小、颜色、透明度) 
plt.scatter(study_time, score, s=50, c='orange', alpha=0.6, edgecolors='black') 
# 3. 添加细节 
plt.title('学习时间与成绩相关性', fontsize=14) 
plt.xlabel('学习时间(小时)', fontsize=12) 
plt.ylabel('成绩(分)', fontsize=12) 
plt.grid(True, alpha=0.3) 
plt.xlim(0, 10) # X轴范围 
plt.ylim(0, 100) # Y轴范围 
plt.show()

        说明:若散点呈现明显的线性趋势,说明两个变量正相关(如学习时间越长,成绩越高)。

3.4 直方图(hist)—— 展示数据分布

        用途:展示数据的分布情况(如学生成绩分布、身高分布、数据误差分布),核心是“分组统计频次”。

# 1. 准备数据(模拟1000名学生的成绩,正态分布) 
scores = np.random.normal(75, 10, 1000) # 均值75,标准差10,1000个数据 
# 2. 绘制直方图(bins:分组数量;edgecolor:柱子边框颜色) 
plt.hist(scores, bins=20, color='lightblue', edgecolor='black', alpha=0.7) 
# 3. 添加细节 
plt.title('1000名学生成绩分布', fontsize=14) 
plt.xlabel('成绩(分)', fontsize=12) 
plt.ylabel('学生人数', fontsize=12) 
plt.grid(True, axis='y', alpha=0.3) 
plt.axvline(scores.mean(), color='red', linestyle='--', label=f'平均分:{scores.mean():.1f}') # 平均分竖线 plt.legend() plt.show()

关键参数bins 表示将数据分成多少组,组数越多,分布越细致(一般取10~30为宜)。

3.5 饼图(pie)—— 展示占比

        用途:展示各部分占总体的比例(如市场份额、开支占比、班级人数占比),注意:数据总和最好为100%,且类别不宜过多(建议不超过6个)。

# 1. 准备数据(模拟家庭月开支占比) 
expenses = [3000, 1500, 1000, 800, 700] 
labels = ['房贷', '饮食', '交通', '娱乐', '其他'] 
colors = ['#FF9999', '#66B2FF', '#99FF99', '#FFCC99', '#FF99CC'] 
# 2. 绘制饼图(autopct:显示百分比;explode:突出某一部分) 
explode = (0.1, 0, 0, 0, 0) # 突出“房贷”部分(偏离圆心) 
plt.pie(expenses, labels=labels, colors=colors, autopct='%1.1f%%', explode=explode, shadow=True) 
# 3. 调整饼图为正圆形(默认是正圆形)(equal:正圆 auto:椭圆) 
plt.axis('equal') 
# 4. 添加细节 
plt.title('家庭月开支占比', fontsize=14) 
plt.show()

关键参数autopct='%1.1f%%' 表示保留1位小数的百分比,shadow=True 表示添加阴影,增强立体感。

3.6 箱线图(boxplot)—— 展示数据离散程度 

        用途:展示数据的离散程度、中位数、四分位数、异常值(如不同班级成绩的离散情况、产品质量波动)。

# 1. 准备数据(模拟3个班级的成绩) 
class1 = np.random.normal(70, 8, 50) 
class2 = np.random.normal(80, 6, 50) 
class3 = np.random.normal(75, 10, 50) 
data = [class1, class2, class3] 
# 2. 绘制箱线图(patch_artist:填充箱体颜色) 
box = plt.boxplot(data, patch_artist=True, labels=['班级1', '班级2', '班级3']) 
# 3. 给箱体设置不同颜色 
colors = ['lightblue', 'lightgreen', 'lightpink'] 
for patch, color in zip(box['boxes'], colors): 
    patch.set_facecolor(color) 
# 4. 添加细节 
plt.title('3个班级成绩离散程度对比', fontsize=14) 
plt.xlabel('班级', fontsize=12) 
plt.ylabel('成绩(分)', fontsize=12) 
plt.grid(True, axis='y', alpha=0.3) 
plt.show()

箱线图解读:箱体的上下沿分别是上四分位数(Q3)和下四分位数(Q1),中间横线是中位数, whisker(须)是数据的合理范围,超出须的点是异常值。

4. 进阶:图表自定义美化(字体 、颜色、样式)

        入门阶段绘制的图表比较基础,进阶阶段重点学习“自定义美化”,让图表更专业、更美观,适配报告、论文等场景。核心美化方向:字体设置、颜色搭配、线条样式、图例优化、背景调整。

4.1 字体设置(解决中文乱码)

        Matplotlib 默认不支持中文,直接显示中文会出现乱码(方框),需手动设置中文字体,常用字体:SimHei(黑体)、Microsoft YaHei(微软雅黑)、SimSun(宋体)。

# 方法1:临时设置(仅当前代码有效) 
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示 
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示异常 
# 方法2:永久设置(需修改Matplotlib配置文件,不推荐新手) 

# 测试:绘制带中文的图表 
x = np.arange(1, 6) 
y = np.array([10, 20, 15, 25, 20]) 
plt.plot(x, y, label='销量') 
plt.title('月度销量变化', fontsize=14, fontweight='bold') # fontweight:字体粗细 plt.xlabel('月份', fontsize=12) 
plt.ylabel('销量(件)', fontsize=12) 
plt.legend(fontsize=10) # 图例字体大小 
plt.show()

4.2 颜色搭配(专业美观)

        颜色是图表美观的核心,推荐3种搭配方式,避免杂乱:

  • 单色搭配:同一图表用同一种颜色,通过线条粗细、透明度区分(适合折线图);
  • 同色系搭配:使用同一颜色的不同深浅(如浅蓝、中蓝、深蓝),适合对比类图表;
  • 对比色搭配:使用互补色(如蓝-橙、红-绿),适合突出重点数据(注意不要超过3种颜色)。
# 示例:同色系搭配(柱状图) 
x = ['A', 'B', 'C', 'D'] 
y = [50, 70, 60, 80] 
colors = ['#4ECDC4', '#45B7D1', '#3498DB', '#2980B9'] # 蓝色系渐变 
plt.bar(x, y, color=colors, width=0.6) 
plt.title('同色系搭配示例', fontsize=14) 
plt.xlabel('类别') 
plt.ylabel('数值') 
plt.show()

4.3 图表样式与背景调整

        可通过 plt.style.use() 调用 Matplotlib 内置样式,快速美化图表,也可手动调整背景、网格、边框。

# 1. 使用内置样式(常用:seaborn-darkgrid、ggplot、bmh) 
plt.style.use('seaborn-v0_8-darkgrid') # 深色网格样式 
# 2. 绘制图表 
x = np.linspace(0, 10, 100) # 0~10之间生成100个均匀数据点 
y1 = np.sin(x) # 正弦曲线 
y2 = np.cos(x) # 余弦曲线 
plt.plot(x, y1, label='sin(x)', linewidth=2) 
plt.plot(x, y2, label='cos(x)', linewidth=2, linestyle='--') 
# 3. 手动调整背景(透明背景) 
fig = plt.gcf() # 获取当前画布 
fig.patch.set_alpha(0.0) # 画布背景透明 
# 4. 优化细节 
plt.title('正弦曲线与余弦曲线', fontsize=14) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.legend() 
plt.show()

常用内置样式:seaborn-v0_8-darkgrid(深色网格)、ggplot(仿R语言ggplot样式)、bmh(简洁风格)、classic(经典样式)。

补充:

print(plt.style.available) #此方法可以打印支持的样式

4.4 图例与标签优化

        图例和标签是图表的“说明”,优化后更易读:

# 示例:优化图例和标签 
x = np.arange(1, 6) 
y1 = [12, 15, 13, 18, 16] 
y2 = [10, 14, 12, 16, 15] 
# 绘制两条折线,设置不同样式 
plt.plot(x, y1, color='red', marker='o', label='A产品', linewidth=2) 
plt.plot(x, y2, color='blue', marker='s', label='B产品', linewidth=2, linestyle='--') 
# 优化图例:设置位置、字体、边框
# loc:图例位置(upper left/right、lower left/right);frameon:显示图例边框  
plt.legend(loc='upper left', fontsize=10, frameon=True, edgecolor='black', facecolor='lightgray') 
# 优化标签:设置字体、颜色 
plt.xlabel('月份', fontsize=12, color='darkblue') 
plt.ylabel('销量(件)', fontsize=12, color='darkblue') 
plt.title('A、B产品月度销量对比', fontsize=14, fontweight='bold', color='darkred') plt.grid(True, alpha=0.3) 
plt.show()

5. 进阶:多子图布局与组合图表

        实际应用中,经常需要在同一画布上绘制多个图表(如对比不同数据、展示多维度信息),这就需要用到“多子图布局”。核心方法:plt.subplot()(简单布局) plt.subplots()(灵活布局)

5.1 简单多子图(plt.subplot())

        语法plt.subplot(行数, 列数, 子图序号),序号从1开始,从左到右、从上到下排列。

# 1. 设置中文字体 
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
# 2. 创建2行2列的多子图(4个子图) 
plt.subplot(2, 2, 1) # 第1行第1列,第1个子图 
x1 = np.arange(1, 6) 
y1 = np.array([2,4,6,8,10]) 
plt.plot(x1, y1, color='red') 
plt.title('子图1:折线图') 
plt.grid(True, alpha=0.3)
plt.subplot(2, 2, 2) # 第1行第2列,第2个子图 
x2 = ['A', 'B', 'C'] 
y2 = [50, 70, 60] 
plt.bar(x2, y2, color='blue') 
plt.title('子图2:柱状图') 
plt.subplot(2, 2, 3) # 第2行第1列,第3个子图 
x3 = np.random.randint(1, 10, 30) 
y3 = x3 * 2 + np.random.randn(30) 
plt.scatter(x3, y3, color='green', alpha=0.6) 
plt.title('子图3:散点图') 
plt.subplot(2, 2, 4) # 第2行第2列,第4个子图 
data4 = [30, 40, 30] 
labels4 = ['甲', '乙', '丙'] 
plt.pie(data4, labels=labels4, autopct='%1.1f%%', colors=['lightblue', 'lightgreen', 'lightpink']) 
plt.axis('equal') 
plt.title('子图4:饼图') 
# 调整子图间距(避免标题、标签重叠) 
plt.tight_layout() 
# 显示图表 
plt.show()

5.2 灵活多子图(plt.subplots())

        `plt.subplots()` 会同时创建画布(Figure)和所有子图(Axes数组),适合复杂布局,可通过 ax[row, col] 定位子图,比 plt.subplot() 更灵活。

# 1. 设置中文字体 
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
# 2. 创建2行3列的子图,设置画布大小 
fig, ax = plt.subplots(2, 3, figsize=(15, 10)) # ax是2行3列的数组 
# 3. 绘制第1行第1个子图(ax[0,0]) 
x1 = np.linspace(0, 10, 100) 
ax[0,0].plot(x1, np.sin(x1), color='red') 
ax[0,0].set_title('正弦曲线') 
ax[0,0].grid(True, alpha=0.3) 
# 4. 绘制第1行第2个子图(ax[0,1]) 
ax[0,1].hist(np.random.normal(75, 10, 100), bins=15, color='lightblue', edgecolor='black') ax[0,1].set_title('成绩分布') 
ax[0,1].set_xlabel('成绩') 
ax[0,1].set_ylabel('人数') 
# 5. 绘制第1行第3个子图(ax[0,2]) 
ax[0,2].boxplot([np.random.normal(70, 8, 50), np.random.normal(80, 6, 50)]) ax[0,2].set_title('两个班级成绩对比') 
ax[0,2].set_xticklabels(['班级1', '班级2']) 
# 6. 绘制第2行第1个子图(ax[1,0]) 
ax[1,0].barh(['A', 'B', 'C'], [50, 70, 60], color='green') 
ax[1,0].set_title('水平柱状图') 
ax[1,0].set_xlabel('数值') 
# 7. 绘制第2行第2个子图(ax[1,1]) 
ax[1,1].scatter(np.random.rand(50), np.random.rand(50), s=50, alpha=0.6, color='orange') ax[1,1].set_title('随机散点图') 
# 8. 绘制第2行第3个子图(ax[1,2]) 
ax[1,2].pie([20, 30, 40, 10], labels=['春', '夏', '秋', '冬'], autopct='%1.1f%%') ax[1,2].axis('equal') 
ax[1,2].set_title('季节占比') 
# 调整子图间距 
plt.tight_layout() 
plt.show()

5.3 组合图表(同一子图绘制多种图表)

        有时需要在同一个子图中绘制多种图表(如折线图+柱状图),用于展示互补数据(如销量趋势+销量实际值)。

# 1. 设置中文字体 
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
# 2. 准备数据 
x = np.arange(1, 7) # 6个月 
sales = [500, 620, 580, 700, 650, 750] # 销量实际值 
trend = [480, 550, 600, 680, 720, 800] # 销量趋势预测值 
# 3. 绘制柱状图(销量实际值) 
plt.bar(x, sales, color='lightblue', label='实际销量', alpha=0.7) 
# 4. 绘制折线图(销量趋势) 
plt.plot(x, trend, color='red', linewidth=2, marker='o', label='趋势预测') 
# 5. 添加数值标签(柱状图) 
for i, v in enumerate(sales): 
    plt.text(i+1, v + 10, str(v), ha='center') 
# 6. 优化细节 
plt.title('月度销量实际值与趋势预测', fontsize=14) 
plt.xlabel('月份', fontsize=12) 
plt.ylabel('销量(件)', fontsize=12) 
plt.legend() 
plt.grid(True, axis='y', alpha=0.3) 
plt.xticks(x) 
plt.show()

6. 进阶:特殊图表与高级用法

        除了基础图表,Matplotlib 还支持多种特殊图表,用于应对更复杂的可视化场景(如热力图、雷达图、等高线图),掌握这些用法,可提升可视化能力。

6.1 热力图(heatmap)—— 展示矩阵相关性

        用途:展示矩阵中数值的大小(用颜色深浅表示),常用于相关性分析(如特征相关性、地区数据对比)。注意:Matplotlib 原生绘制热力图较繁琐,推荐结合 Seaborn 库(Matplotlib 扩展库),简化代码。

# 1. 安装 Seaborn(若未安装)
pip install seaborn 
# 2. 导入库、设置中文字体 
import seaborn as sns 
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
# 3. 准备数据(模拟5个特征的相关性矩阵) 
data = np.random.rand(5, 5) # 5x5随机矩阵(0~1) 
labels = ['特征1', '特征2', '特征3', '特征4', '特征5'] 
# 4. 绘制热力图 
# annot=True:显示数值;cmap:颜色映射;linewidths:网格线宽度 
sns.heatmap(data, annot=True, cmap='YlGnBu', xticklabels=labels, yticklabels=labels, linewidths=0.5) 
# 5. 添加标题 
plt.title('5个特征相关性热力图', fontsize=14) 
plt.show()

常用颜色映射(cmap):YlGnBu(蓝绿渐变)、RdBu(红蓝渐变)、Greens(绿色渐变)。

6.2 雷达图(polar plot)—— 展示多维度数据

        用途:展示多维度数据的对比(如不同产品的多个指标、不同人的能力评分),直观呈现各维度的强弱。

# 1. 设置中文字体 
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
# 2. 准备数据(模拟3个产品的5个指标评分) 
categories = ['性价比', '外观', '性能', '续航', '售后'] 
# 维度 
product1 = [8, 7, 9, 6, 8] 
product2 = [7, 9, 8, 7, 9] 
product3 = [9, 8, 7, 8, 7] 
# 3. 计算角度(雷达图需要极坐标) 
N = len(categories) 
angles = [n / float(N) * 2 * np.pi for n in range(N)] # 每个维度的角度 
angles += angles[:1] # 闭合雷达图 
# 4. 准备数据(闭合) 
product1 += product1[:1] 
product2 += product2[:1] 
product3 += product3[:1] 
# 5. 创建极坐标画布 
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True)) 
# 6. 绘制雷达图 
ax.plot(angles, product1, 'o-', linewidth=2, label='产品1', color='red') 
ax.fill(angles, product1, alpha=0.25, color='red') # 填充颜色 
ax.plot(angles, product2, 'o-', linewidth=2, label='产品2', color='blue') 
ax.fill(angles, product2, alpha=0.25, color='blue') 
ax.plot(angles, product3, 'o-', linewidth=2, label='产品3', color='green') 
ax.fill(angles, product3, alpha=0.25, color='green') 
# 7. 优化细节 
ax.set_xticks(angles[:-1]) # 设置角度刻度 
ax.set_xticklabels(categories) # 维度标签 
ax.set_ylim(0, 10) # Y轴范围(评分0~10) 
ax.set_title('3个产品多维度对比雷达图', fontsize=14, pad=20) # pad:标题与图表的距离 ax.legend(loc='upper right', bbox_to_anchor=(1.2, 1.0)) # 图例位置 
plt.show()

6.3 等高线图(contourf)—— 展示二维数据分布

        用途:展示二维数据的分布(如地形高度、温度分布、函数值分布),用等高线和颜色表示数值的高低。

# 1. 准备数据(模拟二维函数分布) 
x = np.linspace(-5, 5, 100) 
y = np.linspace(-5, 5, 100) 
X, Y = np.meshgrid(x, y) # 生成网格数据 
Z = np.sin(np.sqrt(X**2 + Y**2)) # 二维函数:sin(√(x²+y²)) 
# 2. 绘制等高线图 
plt.contourf(X, Y, Z, cmap='coolwarm', alpha=0.8) # contourf:填充等高线 plt.colorbar(label='函数值') # 颜色条(表示数值对应关系) 
# 3. 添加等高线线条(黑色) 
plt.contour(X, Y, Z, colors='black', linewidths=0.5) 
# 4. 优化细节 plt.title('二维函数等高线图', fontsize=14) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.axis('equal') 
plt.show()

6.4 图表保存(高清无水印)

        实战中,需要将图表保存为图片(用于报告、论文),核心是用 plt.savefig(),注意保存时机(必须在 plt.show()之前,否则保存为空)。

# 1. 绘制图表 
x = np.arange(1, 6) 
y = np.array([12, 15, 13, 18, 16]) 
plt.plot(x, y, color='red', marker='o') 
plt.title('月度销量变化') 
plt.xlabel('月份') 
plt.ylabel('销量') 
# 2. 保存图表(高清、无水印)
# dpi:分辨率(300为宜,高清);bbox_inches='tight':避免标签被截断;facecolor='white':白色背景 
plt.savefig('销量变化图.png', dpi=300, bbox_inches='tight', facecolor='white') 
# 3. 显示图表 
plt.show()

        支持保存格式:png、jpg、pdf、svg 等,其中 pdf、svg 是矢量图(放大不失真),适合论文、印刷。

7. 精通:3D 绘图入门

        Matplotlib 支持 3D 绘图,可展示三维数据的分布(如 3D 散点图、3D 曲面图),常用于科学计算、工程可视化等场景,核心是导入 mplot3d 模块。

7.1 3D 散点图(scatter3D)

# 1. 导入3D模块
from mpl_toolkits.mplot3d import Axes3D
 
# 2. 准备数据(模拟三维数据)
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
 
# 3. 创建3D画布
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')  # projection='3d' 表示3D子图
 
# 4. 绘制3D散点图
ax.scatter3D(x, y, z, c=z, cmap='viridis', s=50, alpha=0.7)  # c=z:用z值决定颜色
 
# 5. 优化细节
ax.set_xlabel('X轴', fontsize=12)
ax.set_ylabel('Y轴', fontsize=12)
ax.set_zlabel('Z轴', fontsize=12)
ax.set_title('3D散点图示例', fontsize=14)
 
plt.show()

7.2 3D 曲面图(plot_surface)

# 1. 导入3D模块
from mpl_toolkits.mplot3d import Axes3D
 
# 2. 准备数据(模拟三维曲面)
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))  # 与等高线图相同的函数
 
# 3. 创建3D画布
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
 
# 4. 绘制3D曲面图
surface = ax.plot_surface(X, Y, Z, cmap='coolwarm', alpha=0.8, linewidth=0)
 
# 5. 添加颜色条
fig.colorbar(surface, ax=ax, shrink=0.5, aspect=5)  # shrink:颜色条大小;aspect:长宽比
 
# 6. 优化细节
ax.set_xlabel('X轴', fontsize=12)
ax.set_ylabel('Y轴', fontsize=12)
ax.set_zlabel('Z轴', fontsize=12)
ax.set_title('3D曲面图示例', fontsize=14)
 
plt.show()

8. 精通:与 NumPy/Pandas 联动(实战重点)

        实际数据可视化中,数据往往存储在 NumPy 数组或 Pandas DataFrame 中,Matplotlib 可直接读取这些数据绘图,无需手动转换,这是实战中最常用的方式。

8.1 与 NumPy 联动(基础)

        NumPy 数组可直接作为 plt.plot()、plt.scatter() 等函数的参数,前面的示例已大量用到,这里重点展示“批量处理多组数据”。

# 1. 准备NumPy数据(3组时间序列数据)
x = np.arange(1, 11)  # 1~10天
data = np.random.randint(10, 30, (3, 10))  # 3组数据,每组10个值(10~29)
 
# 2. 批量绘制折线图(循环遍历每组数据)
labels = ['A组', 'B组', 'C组']
colors = ['red', 'blue', 'green']
for i in range(3):
    plt.plot(x, data[i], color=colors[i], label=labels[i], linewidth=2, marker='o')
 
# 3. 优化细节
plt.title('3组数据时间序列对比', fontsize=14)
plt.xlabel('天数', fontsize=12)
plt.ylabel('数值', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)
plt.xticks(x)
 
plt.show()

8.2 与 Pandas 联动(实战核心)

        Pandas DataFrame 是数据处理的核心结构,Matplotlib 可直接读取 DataFrame 的列数据绘图,简化数据准备流程,适合处理真实数据集

# 1. 准备Pandas数据(模拟销售数据集)
data = pd.DataFrame({
    '月份': np.arange(1, 13),
    '销量': [500, 550, 600, 680, 720, 780, 800, 750, 700, 650, 600, 580],
    '销售额': [50000, 55000, 60000, 68000, 72000, 78000, 80000, 75000, 70000, 65000, 60000, 58000],
    '利润': [10000, 11000, 12000, 13600, 14400, 15600, 16000, 15000, 14000, 13000, 12000, 11600]
})
 
# 2. 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
 
# 3. 绘制组合图表(销量+销售额,双Y轴)
fig, ax1 = plt.subplots(figsize=(12, 6))
 
# 3.1 第一个Y轴:销量(柱状图)
ax1.bar(data['月份'], data['销量'], color='lightblue', alpha=0.7, label='销量')
ax1.set_xlabel('月份', fontsize=12)
ax1.set_ylabel('销量(件)', fontsize=12, color='blue')
ax1.tick_params(axis='y', labelcolor='blue')  # Y轴刻度颜色
 
# 3.2 第二个Y轴:销售额(折线图)
ax2 = ax1.twinx()  # 共享X轴,创建第二个Y轴
ax2.plot(data['月份'], data['销售额'], color='red', linewidth=2, marker='o', label='销售额')
ax2.set_ylabel('销售额(元)', fontsize=12, color='red')
ax2.tick_params(axis='y', labelcolor='red')
 
# 4. 合并图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')
 
# 5. 优化细节
plt.title('月度销量与销售额趋势', fontsize=14)
plt.grid(True, axis='y', alpha=0.3)
plt.xticks(data['月份'])
 
plt.show()

        关键技巧ax1.twinx() 创建双Y轴,适合展示两个量级不同的数据(如销量和销售额),避免其中一个数据被“压缩”,无法看清趋势。

9. 实战案例(3个高频场景)

此部分原博不完整,可惜了

        结合前面的知识点,通过3个高频实战案例,巩固 Matplotlib 用法,覆盖“数据处理→绘图→美化→保存”全流程,可直接套用在实际工作中

案例1:学生成绩分析可视化

需求:分析50名学生的语文、数学、英语成绩,展示成绩分布、各科成绩对比、各科相关性。

# 1. 导入库、设置中文字体
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
 
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
 
# 2. 准备数据(模拟50名学生成绩)
np.random.seed(10)  # 固定随机种子,结果可复现
data = pd.DataFrame({
    '语文': np.random.normal(75, 8, 50).round(1),
    '数学': np.random.normal(80, 7, 50).round(1),
    '英语': np.random.normal(78, 9, 50).round(1)
})
 
# 3. 创建2行2列多子图
fig, ax = plt.subplots(2, 2, figsize=(14, 10))
 
# 3.1 子图1:各科成绩箱线图(对比离散程度)
ax[0,0].boxplot([data['语文'], data['数学'], data['英语']], patch_artist=True)
ax[0,0].set_xticklabels(['语文', '数学', '英语'])
ax[0,0].set_title('各科成绩离散程度对比')
ax[0,0].set_ylabel('成绩(分)')
ax[0,0].grid(True, axis='y', alpha=0.3)
 
# 3.2 子图2:各科成绩直方图(分布情况)
ax[0,1

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐