一、思维导图

二、Matplotlib基础:从安装到核心概念
2.1 为什么选择Matplotlib?
Matplotlib是一款基于Python的开源绘图库,设计初衷是提供"类MATLAB风格"的API,让熟悉MATLAB的用户能快速上手。它的核心优势体现在四个方面:
- 低门槛上手:API逻辑清晰,从"导入库→准备数据→绘制图表→显示保存"的流程固定,初学者30分钟就能画出第一个线图。
- 超高可定制性:小到线条宽度、标记颜色,大到图表布局、字体样式,几乎所有视觉元素都能调整,满足个性化需求。
- 多数据源兼容:能直接处理列表、NumPy数组、Pandas DataFrame等主流数据格式,无需复杂的数据转换。
- 跨平台稳定性:完美支持Windows、Linux、macOS三大操作系统,生成的图表可导出为PNG、PDF、SVG等10+种格式。
重难点标注:Matplotlib的核心是"层级结构"——
Figure(画布)包含Axes(绘图区域),Axes包含坐标轴、线条、标记等元素,理解这一结构是后续复杂绘图的基础。
2.2 环境准备:5分钟完成安装与导入
2.2.1 安装命令
Matplotlib是第三方库,需通过pip安装,打开终端输入以下命令(Python环境需提前配置):
pip install matplotlib
# 若需处理数值计算,建议同时安装NumPy(后续示例会用到)
pip install numpy
2.2.2 常规导入方式
行业通用约定是将matplotlib.pyplot缩写为plt,这能简化代码,同时保证可读性:
import matplotlib.pyplot as plt # 核心绘图模块
import numpy as np # 用于生成测试数据(非必需但常用)
三、核心图表实战:从基础到定制
3.1 线图:展示数据趋势的"万能工具"
线图是最常用的图表类型,适合展示连续数据的变化趋势(如时间序列、函数曲线),核心函数是plt.plot()。
3.1.1 函数原型与关键参数
plt.plot(x, y, fmt, **kwargs)
- 必选参数:
x:x轴坐标数据(列表/数组),若不指定,默认用range(len(y))(即0,1,2…)。y:y轴坐标数据(列表/数组),核心数据来源。
- 可选参数:
fmt:字符串格式,快速设置"颜色+标记+线型",例如'ro--'表示"红色+圆圈标记+虚线"。**kwargs:关键字参数,用于精细定制,常用的有:label:图例名称(配合plt.legend()显示)。linewidth/lw:线条宽度(数值越大越粗)。marker:数据点标记样式(如'o'圆圈、's'正方形,完整样式见下文表格)。alpha:透明度(0=完全透明,1=不透明)。
3.1.2 常用线型与标记样式表
| 类型 | 字符 | 说明 | 类型 | 字符 | 说明 |
|---|---|---|---|---|---|
| 线型 | - | 实线 | 标记 | o | 圆圈 |
| 线型 | -- | 虚线 | 标记 | s | 正方形 |
| 线型 | -. | 虚点线 | 标记 | ^ | 上三角 |
| 线型 | : | 点线 | 标记 | + | 加号 |
| 标记 | . | 句号点 | 标记 | x | 乘号 |
3.1.3 实战案例1:正弦曲线
import matplotlib.pyplot as plt # 核心绘图模块
import numpy as np # 用于生成测试数据(非必需但常用)
# 1. 准备数据:生成0到3π的连续x值,步长0.1(保证曲线平滑)
x = np.arange(0, 3 * np.pi, 0.1) # np.arange是NumPy的等差数组函数
y = np.sin(x) # 计算x对应的正弦值
# 2. 绘制线图:精细设置样式
plt.plot(
x, y, # 核心数据
'-', # 线型:实线
label='Sine Wave', # 图例名称
linewidth=2, # 线宽2
color='blue', # 线条颜色:蓝色
marker='o', # 标记:圆圈
markersize=5, # 标记大小5
markeredgecolor='black', # 标记边缘颜色:黑色
markeredgewidth=1, # 标记边缘宽度1
markerfacecolor='none', # 标记内部:透明(只显示边缘)
alpha=0.5 # 整体透明度0.5
)
# 3. 添加辅助元素
plt.xlabel('x (Radians)') # x轴标签:说明x的含义(弧度)
plt.ylabel('sin(x)') # y轴标签:说明y的含义(正弦值)
plt.legend() # 显示图例(依赖label参数)
plt.title('Sine Wave Plot')# 图表标题
# 4. 显示与保存
plt.show() # 弹出窗口显示图表
# plt.savefig('sine_wave.png', dpi=300, bbox_inches='tight') # 保存为高清PNG(dpi=分辨率)
运行效果:

3.1.4 实战案例2:直线图(两点确定一条线)
import matplotlib.pyplot as plt # 核心绘图模块
import numpy as np # 用于生成测试数据(非必需但常用)
# 1. 准备数据:两个点的坐标(x从0到5,y从0到10)
x = np.array([0, 5]) # x轴两个点:0和5
y = np.array([0, 10]) # y轴对应点:0和10
# 2. 绘制直线
plt.plot(
x, y,
'-',
label='Line between (0,0) and (5,10)',
color='red', # 线条颜色:红色
linewidth=2,
marker='o',
markersize=10, # 标记更大(10),更醒目
markeredgecolor='black',
markeredgewidth=2,
alpha=1.0 # 不透明,突出直线
)
# 3. 辅助元素
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Simple Line Plot')
# 4. 显示
plt.show()
运行效果: 
3.2 散点图:展示数据分布与相关性
散点图用于展示两个变量的关系(如身高与体重),或按第三个变量映射颜色/大小(如按"性别"分颜色),核心函数是plt.scatter()。
3.2.1 核心参数解析
s:散点大小(标量/数组,数组可实现"每个点大小不同")。c:散点颜色(单个颜色/数组,数组配合cmap可实现颜色渐变)。cmap:颜色映射表(如'viridis'、'plasma',Matplotlib内置20+种)。edgecolors:散点边缘颜色(避免点重叠时看不清)。
3.2.2 实战案例:正弦曲线散点图(带颜色映射)
import matplotlib.pyplot as plt # 核心绘图模块
import numpy as np # 用于生成测试数据(非必需但常用)
# 1. 准备数据
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
colors = y # 用y值(正弦值)映射颜色:y越大,颜色越亮
# 2. 绘制散点图
scatter = plt.scatter(
x, y,
s=10, # 散点大小10
c=colors, # 颜色由y值决定
marker='o',
cmap='viridis', # 颜色映射:蓝→绿→黄
vmin=-1, # 颜色最小值(对应y=-1)
vmax=1, # 颜色最大值(对应y=1)
alpha=0.5,
linewidths=0.5, # 散点边缘宽度
edgecolors='white' # 边缘白色,增强对比度
)
# 3. 辅助元素:添加颜色条(说明颜色与y值的对应关系)
plt.colorbar(scatter, label='sin(x) Value') # colorbar绑定散点图,添加标签
plt.xlabel('x (Radians)')
plt.ylabel('sin(x)')
plt.title('Sine Wave Scatter Plot')
# 4. 显示
plt.show()
运行效果:

3.3 条形图:对比不同类别的数据
条形图(柱状图)适合对比多个类别的数值(如各部门销售额、各学科平均分),核心函数是plt.bar(),支持横向/纵向条形、堆叠条形等变种。
3.3.1 关键参数
x:条形的x轴位置(通常是类别标签,如[‘A’,‘B’,‘C’])。height:条形的高度(核心数据,对应类别数值)。width:条形宽度(默认0.8,数组可实现"每个条形宽度不同")。hatch:条形内部填充图案(如'x'交叉线、'/'斜线,增加视觉区分)。color/facecolor:条形填充颜色。
3.3.2 实战案例:带中文标签的条形图
Matplotlib默认不支持中文字体,需手动设置,这是实战中的常见"坑点",以下代码已解决:
import matplotlib.pyplot as plt # 核心绘图模块
import numpy as np
# 1. 解决中文显示问题(关键步骤)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows用"SimHei",macOS用"Arial Unicode MS"
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
# 2. 准备数据:类别标签和对应数值
labels = ['类别A', '类别B', '类别C', '类别D', '类别E']
values = [23, 45, 56, 78, 33]
# 3. 绘制条形图
plt.bar(
labels, # x轴:类别标签
values, # y轴:条形高度(数值)
width=0.3, # 条形宽度0.3,避免拥挤
color='blue', # 填充颜色:蓝色
edgecolor='red',# 边缘颜色:红色
linewidth=2, # 边缘宽度2
linestyle='-', # 边缘线型:实线
alpha=0.7, # 透明度0.7
hatch='x', # 内部填充:交叉线
label='数值对比'# 图例名称
)
# 4. 辅助元素
plt.xlabel('类别')
plt.ylabel('数值')
plt.title('中文标签条形图')
plt.legend()
# 5. 显示
plt.show()
运行效果:

3.4 饼图:展示部分与整体的比例
饼图用于展示各部分占总体的比例(如市场份额、成分占比),核心函数是plt.pie(),支持扇区分离、百分比显示等功能。
3.4.1 关键参数
x:各扇区的大小(数值,Matplotlib会自动计算比例)。explode:扇区突出程度(数组,0=不突出,0.1=突出10%,用于强调某部分)。autopct:百分比显示格式(如'%1.1f%%'表示保留1位小数的百分比)。startangle:饼图起始角度(0=x轴正方向,逆时针旋转)。wedgeprops:扇区属性(如边缘颜色、宽度)。
3.4.2 实战案例:带突出扇区的饼图
import matplotlib.pyplot as plt
# 1. 准备数据
sizes = [25, 35, 20, 20] # 各部分大小(总和100,直接对应百分比)
labels = ['部分A', '部分B', '部分C', '部分D']
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue'] # 各扇区颜色
explode = [0, 0.1, 0, 0] # 突出"部分B"(第2个扇区)
# 2. 绘制饼图
plt.pie(
sizes, # 各扇区大小
explode=explode, # 扇区突出设置
labels=labels, # 扇区标签
colors=colors, # 扇区颜色
autopct='%1.1f%%', # 百分比格式:如35.0%
startangle=140, # 起始角度140度(避免"部分A"在正右方)
shadow=False, # 不添加阴影
radius=1, # 饼图半径1(默认大小)
wedgeprops=dict( # 扇区边缘属性
edgecolor='black',
linewidth=2,
linestyle='-'
),
textprops=dict( # 文本属性(标签和百分比)
color='red',
weight='bold' # 粗体
)
)
# 3. 辅助元素:确保饼图为正圆形(避免拉伸)
plt.axis('equal') # 关键!使x轴和y轴比例一致
plt.title('饼图示例(突出部分B)')
# 4. 显示
plt.show()
运行效果:

四、进阶功能:布局与Figure操作
4.1 坐标轴与标签:让图表更易懂
4.1.1 常用辅助函数
plt.xlabel()/plt.ylabel():设置x/y轴标签(说明轴的含义,如"时间(秒)")。plt.title():设置图表标题(概括图表内容,如"2024年月度销售额趋势")。plt.legend():显示图例(依赖plot()/scatter()等函数的label参数)。
4.1.2 示例代码
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y, label='Sine Wave')
# 添加辅助标签
plt.xlabel('x (Radians)', fontsize=12) # 可设置字体大小
plt.ylabel('sin(x)', fontsize=12)
plt.title('Sine Wave with Labels', fontsize=14, pad=20) # pad=标题与图表的间距
plt.legend(fontsize=10)
plt.show()
输出结果:

4.2 子图布局:在一个画布上画多个图
当需要对比多个图表(如正弦和余弦曲线同屏显示)时,子图布局是关键,常用方法有plt.subplot()、plt.subplots()和GridSpec。
4.2.1 方法1:plt.subplot()(简单子图)
语法:plt.subplot(nrows, ncols, plot_number),表示"n行n列的子图网格,当前操作第plot_number个(从1开始)"。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 3 * np.pi, 0.01)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 第一个子图:2行1列,第1个
plt.subplot(2, 1, 1)
plt.plot(x, y_sin)
plt.title('Sine Wave')
# 第二个子图:2行1列,第2个
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine Wave')
# 自动调整间距,避免标签重叠
plt.tight_layout()
plt.show()
运行效果:

4.2.2 方法2:plt.subplots()(批量创建子图)
语法:fig, axs = plt.subplots(nrows, ncols),返回Figure对象和子图数组axs,适合批量操作。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.01)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = 1/(1+np.exp(-x)) # Sigmoid函数
# 创建2行2列的子图网格
fig, axs = plt.subplots(2, 2, figsize=(10, 8)) # figsize=画布大小(英寸)
# 第1个子图(0行0列)
axs[0, 0].plot(x, y1)
axs[0, 0].set_title('Sine Wave') # 子图标题用set_title()
axs[0, 0].set_xlabel('x') # 子图轴标签用set_xlabel()
# 第2个子图(0行1列)
axs[0, 1].plot(x, y2)
axs[0, 1].set_title('Cosine Wave')
axs[0, 1].set_xlabel('x')
# 第3个子图(1行0列)
axs[1, 0].plot(x, y3)
axs[1, 0].set_title('Tangent Wave')
axs[1, 0].set_xlabel('x')
# 第4个子图(1行1列)
axs[1, 1].plot(x, y4)
axs[1, 1].set_title('Sigmoid Function')
axs[1, 1].set_xlabel('x')
# 调整间距
plt.tight_layout()
plt.show()
运行效果:

4.2.3 方法3:GridSpec(灵活子图,跨列/跨行)
当需要非均匀子图(如某子图跨2列)时,GridSpec是最佳选择,支持定制列宽、行高比例。
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import matplotlib
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans'] # 设置支持中文的字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
# 创建画布
fig = plt.figure(figsize=(10, 6))
# 定义GridSpec:2行3列,列宽比例2:1:1,行高比例1:1.5
gs = GridSpec(
nrows=2,
ncols=3,
width_ratios=[2, 1, 1], # 第1列宽度是第2、3列的2倍
height_ratios=[1, 1.5] # 第2行高度是第1行的1.5倍
)
# 添加子图:按GridSpec定位
ax1 = fig.add_subplot(gs[0, 0]) # 第1行第1列
ax2 = fig.add_subplot(gs[0, 1]) # 第1行第2列
ax3 = fig.add_subplot(gs[0, 2]) # 第1行第3列
ax4 = fig.add_subplot(gs[1, 0]) # 第2行第1列
ax5 = fig.add_subplot(gs[1, 1:]) # 第2行第2~3列(跨2列)
# 为子图添加文本标识
ax1.text(0.5, 0.5, '子图1\n(1行1列)', ha='center', va='center', fontsize=12)
ax2.text(0.5, 0.5, '子图2\n(1行2列)', ha='center', va='center', fontsize=12)
ax3.text(0.5, 0.5, '子图3\n(1行3列)', ha='center', va='center', fontsize=12)
ax4.text(0.5, 0.5, '子图4\n(2行1列)', ha='center', va='center', fontsize=12)
ax5.text(0.5, 0.5, '子图5\n(2行2-3列)', ha='center', va='center', fontsize=12)
# 调整间距
plt.tight_layout()
plt.show()
运行效果:

4.3 Figure对象:画布的"总控台"
Figure是Matplotlib的顶级对象,代表整个画布,所有子图、文本、图例都在Figure上,常用方法如下:
| 方法名 | 功能描述 | 示例代码 |
|---|---|---|
add_subplot() | 添加子图(基于行列定位) | fig.add_subplot(2,1,1) |
add_axes() | 在任意位置添加子图(自定义坐标) | fig.add_axes([0.1,0.1,0.5,0.5]) |
suptitle() | 添加画布总标题(子图标题之上) | fig.suptitle('总标题', fontsize=16) |
set_size_inches() | 设置画布大小(英寸) | fig.set_size_inches(10,6) |
get_dpi() | 获取画布分辨率(DPI) | print(fig.get_dpi()) |
tight_layout() | 自动调整子图间距 | fig.tight_layout() |
实战案例:Figure方法综合使用
import matplotlib.pyplot as plt
# 1. 显式创建Figure对象
fig = plt.figure(figsize=(8, 6), facecolor='lightgray') # 画布大小8x6,背景浅灰色
# 2. 添加子图
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
# 3. 绘制数据
ax1.plot([1,2,3], [1,4,9], label='y=x²')
ax2.plot([1,2,3], [3,2,1], label='y=4-x')
# 4. Figure方法操作
fig.suptitle('Figure总标题', fontsize=14, color='red') # 总标题
fig.set_size_inches(10, 7) # 调整画布大小
print(f"画布DPI:{fig.get_dpi()}") # 打印分辨率
fig.tight_layout() # 调整间距
# 5. 子图辅助元素
ax1.legend()
ax2.legend()
# 6. 显示
plt.show()
运行结果为

4.4 其他实用工具
4.4.1 保存图表:plt.savefig()
# 保存为PNG,分辨率300DPI(高清),紧凑剪裁空白
plt.savefig(
'my_plot.png',
dpi=300,
bbox_inches='tight', # 关键:避免标签被截断
facecolor='white' # 背景色
)
4.4.2 显示图像:plt.imshow()
用于显示二维图像数据(如图片、热力图),与plt.show()的区别是:imshow()创建图像,show()显示所有图像。
# 生成随机10x10图像数据
data = np.random.rand(10, 10)
plt.imshow(data, cmap='viridis') # cmap=颜色映射
plt.colorbar() # 显示颜色条
plt.show()
4.4.3 关闭图表:plt.close()
plt.close() # 关闭当前图表
# plt.close('all') # 关闭所有图表,释放内存
4.4.4 暂停:plt.pause()
用于动画或交互式绘图,暂停指定秒数(如plt.pause(0.01)暂停0.01秒)。
五、总结
重点是四大图表:
1.线图
2.散点图
3.条形图
4.饼图
三大布局系统:
1.plt.subplot:简单快速子图创建
2.plt.subplots:批量生成子图数组,代码更整洁
3.GridSpec:灵活复杂布局,支持跨行跨列
2万+

被折叠的 条评论
为什么被折叠?



