← 返回数据分析目录
← 返回学习笔记首页
Matplotlib基础与图表类型
数据分析专题 · 从零开始的Python可视化
专题: Python数据分析系统学习
关键词: 数据分析, Matplotlib, 可视化, pyplot, 折线图, 散点图, 柱状图, 直方图, 箱线图
一、Matplotlib概述
Matplotlib是Python生态中最成熟、使用最广泛的2D绘图库,由John D. Hunter于2003年创建,最初灵感来源于MATLAB的绘图功能。它提供了丰富的API,能够生成出版质量级别的静态图表,同时也支持简单的动画和交互式图形。几乎所有的数据科学和机器学习项目都会依赖Matplotlib进行数据可视化和结果展示。
安装Matplotlib非常简单,推荐使用pip或conda进行安装。安装完成后,在代码中导入即可使用。通常情况下我们导入pyplot子模块并约定其别名为plt,这是最常用的导入方式。如果需要在Jupyter Notebook中内嵌显示图表,还需要执行%matplotlib inline命令。
# 安装命令(终端执行)
pip install matplotlib
# 标准导入方式
import matplotlib.pyplot as plt
import numpy as np # 配合生成数据
# Jupyter Notebook中内嵌显示
%matplotlib inline
Matplotlib的核心设计理念是提供对图表每个元素的精细控制。从标题、坐标轴标签到刻度标记、图例位置,几乎所有视觉元素都可以被程序化地调整。这种灵活性使得Matplotlib虽然学习曲线略显陡峭,但一旦掌握就能应对几乎任何可视化需求。
版本检查: 使用 print(plt.__version__) 查看已安装的Matplotlib版本。目前稳定版本为3.x系列,建议保持更新以使用最新特性。
二、Figure与Axes对象模型
理解Figure和Axes的概念是掌握Matplotlib的关键。Figure(画布/图形)是整个图表的顶层容器,可以理解为一张空白画纸。一个Figure可以包含一个或多个Axes。Axes(坐标轴/子图)是实际绘制数据的区域,包含x轴和y轴,以及数据、刻度、标签等元素。初学者容易混淆Axes和Axis:Axes 是包含数据区域的整个子图,而Axis 是坐标轴本身(如x轴或y轴)。
# 创建Figure和Axes —— 面向对象方式
fig, ax = plt.subplots() # 创建一个画布和一个子图
fig, axes = plt.subplots(2, 3) # 创建2行3列共6个子图
fig, axes = plt.subplots(2, 2, figsize=(10, 6)) # 指定画布尺寸
# Figure的常用属性
fig = plt.figure(figsize=(8, 5), dpi=100, facecolor='white' )
ax = fig.add_subplot(1, 1, 1) # 在画布上添加一个子图
核心记忆点: Figure是画布(顶层容器),Axes是图表(绘图区域)。用plt.subplots()同时创建两者是最推荐的入门方式。一个Figure可包含多个Axes,每个Axes是一个独立的图表。
subplots的灵活布局
subplots函数接受nrows和ncols参数控制子图的行列数,返回的axes对象是一个NumPy数组,可以通过索引访问每个子图。此外,subplot_mosaic方法(3.3+版本引入)提供了更直观的复杂布局方式。
# 2x2子图布局及访问
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0, 0].plot(x, y) # 第一行第一列
axes[0, 1].scatter(x, y) # 第一行第二列
axes[1, 0].bar(cats, vals) # 第二行第一列
axes[1, 1].hist(data) # 第二行第二列
# 使用subplot_mosaic创建复杂布局(v3.3+)
fig, axes = plt.subplot_mosaic([
['A' , 'B' ],
['C' , 'C' ],
], figsize=(9, 6))
axes['A' ].plot(x, y1)
axes['B' ].plot(x, y2)
axes['C' ].plot(x, y3)
三、pyplot vs 面向对象API
Matplotlib提供了两种编程接口:pyplot API(MATLAB风格)和面向对象API(OOP风格)。两种方式都能完成绘图任务,但在不同场景下各有优劣。理解这两种风格并在合适的场景中灵活切换,是高效使用Matplotlib的关键。
pyplot风格(快速原型)
pyplot风格是Matplotlib入门最快的途径,它维护一个全局的Figure状态,所有绘图命令都作用于"当前"图表。这种方式代码简洁,适合在交互式环境(如Jupyter Notebook)中快速探索数据。
# pyplot风格 —— 简单直接,适合快速绘图
plt.figure(figsize=(8, 5))
plt.plot(x, y, color='blue' , linewidth=2)
plt.title('标题' )
plt.xlabel('X轴标签' )
plt.ylabel('Y轴标签' )
plt.grid(True)
plt.show()
面向对象风格(精细控制)
面向对象风格显式地创建Figure和Axes对象,然后调用这些对象的方法。这种方式更加清晰,尤其是在创建包含多个子图的复杂图表时,可以精确控制每个子图的每个元素。在开发可复用的绘图函数或类时,OOP风格是必然选择。
# 面向对象风格 —— 清晰可控,适合复杂图表
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, y, color='blue' , linewidth=2)
ax.set_title('标题' )
ax.set_xlabel('X轴标签' )
ax.set_ylabel('Y轴标签' )
ax.grid(True)
plt.show()
pyplot风格适用场景
Jupyter Notebook快速探索
单个简单图表
原型验证阶段
教学演示
OOP风格适用场景
多子图复杂布局
生产环境代码
可复用绘图函数库
需要精细化控制每个元素
最佳实践: 在脚本和项目中始终使用OOP风格,在Notebook交互探索时可以使用pyplot风格。记住:plt. 开头的函数大部分都有对应的 ax.plt.plot() 对应 ax.plot())。
四、常用图表类型
Matplotlib支持数十种图表类型,这里我们重点学习最常用的七种:折线图、散点图、柱状图、直方图、箱线图、热力图和饼图。掌握这七种图表足以应对绝大多数数据分析场景。
4.1 折线图 (plot)
折线图是最基础的图表类型,用直线连接数据点,适合展示数据随时间或其他连续变量的变化趋势。在时间序列分析、趋势展示等场景中应用极为广泛。
# 折线图示例
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, y1, label='sin(x)' , color='#3498db' , linewidth=2)
ax.plot(x, y2, label='cos(x)' , color='#e74c3c' , linewidth=2, linestyle='--' )
ax.set_title('正弦余弦曲线' )
ax.legend()
plt.show()
4.2 散点图 (scatter)
散点图用点的位置展示两个变量之间的关系,可以通过点的颜色、大小和形状传递更多维度信息。在相关性分析、聚类结果可视化等场景中非常有用。
# 散点图示例 —— 可编码多维度信息
n = 100
x = np.random.randn(n)
y = x * 0.5 + np.random.randn(n) * 0.3
colors = np.random.rand(n)
sizes = np.random.randint(20, 200, n)
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, c=colors, s=sizes, alpha=0.7,
cmap='viridis' , edgecolors='w' , linewidth=0.5)
ax.set_title('散点图 —— 颜色和大小编码额外维度' )
plt.colorbar(scatter, ax=ax, label='颜色映射' )
plt.show()
4.3 柱状图 (bar)
柱状图用矩形条的高度表示数值大小,适合展示分类变量的数量对比。bar()绘制垂直柱状图,barh()绘制水平柱状图,在分组对比和堆叠展示时尤为常见。
# 柱状图示例 —— 分组对比
categories = ['A' , 'B' , 'C' , 'D' , 'E' ]
values1 = [23, 45, 56, 78, 32]
values2 = [18, 38, 49, 65, 28]
x_pos = np.arange(len(categories))
width = 0.35
fig, ax = plt.subplots(figsize=(9, 6))
bars1 = ax.bar(x_pos - width/2, values1, width, label='组1' , color='#3498db' )
bars2 = ax.bar(x_pos + width/2, values2, width, label='组2' , color='#e67e22' )
ax.set_xticks(x_pos)
ax.set_xticklabels(categories)
ax.set_title('分组柱状图' )
ax.legend()
plt.show()
4.4 直方图 (hist)
直方图用于展示连续数据的分布情况,将数据范围划分为若干个区间(bins),统计每个区间内的数据点数量。与柱状图不同,直方图的x轴是连续变量,柱状图的x轴是分类变量。直方图在探索数据分布形态、检测异常值等方面非常常用。
# 直方图示例 —— 分布分析
data = np.random.randn(1000) * 2 + 5 # 生成正态分布数据
fig, ax = plt.subplots(figsize=(8, 5))
ax.hist(data, bins=30, density=True, alpha=0.7, color='#3498db' ,
edgecolor='white' , linewidth=0.5, label='数据分布' )
# 叠加理论正态分布曲线
x_theory = np.linspace(data.min(), data.max(), 200)
y_theory = (1 / (np.sqrt(2 * np.pi) * 2)) * np.exp(-0.5 * ((x_theory - 5) / 2) ** 2)
ax.plot(x_theory, y_theory, 'r-' , linewidth=2, label='理论正态分布' )
ax.set_title('直方图 —— 数据分布与理论曲线对比' )
ax.legend()
plt.show()
4.5 箱线图 (boxplot)
箱线图通过四分位数、中位数、 whiskers 和异常值来展示数据的分布特征。一个箱线图可以同时展示数据的中位数、离散程度、偏态和异常值,是探索性数据分析中不可或缺的工具。箱体包含数据的第25百分位数(Q1)到第75百分位数(Q3),箱中的横线是中位数,whisker延伸至非异常值范围,单独的点标记为异常值。
# 箱线图示例 —— 多组数据对比
np.random.seed(42)
data1 = np.random.normal(100, 10, 200)
data2 = np.random.normal(90, 20, 200)
data3 = np.random.normal(80, 5, 200)
data4 = np.random.normal(120, 15, 200)
all_data = [data1, data2, data3, data4]
fig, ax = plt.subplots(figsize=(9, 6))
bp = ax.boxplot(all_data, labels=['组A' , '组B' , '组C' , '组D' ],
patch_artist=True, showmeans=True,
boxprops=dict(facecolor='#3498db' , alpha=0.6),
medianprops=dict(color='#e74c3c' , linewidth=2),
meanprops=dict(marker='D' , markerfacecolor='green' , markersize=6))
ax.set_title('箱线图 —— 四组数据分布对比' )
ax.set_ylabel('数值' )
plt.show()
4.6 热力图 (imshow / pcolormesh)
热力图通过颜色编码展示二维矩阵数据的值的大小,常用在相关性矩阵展示、混淆矩阵可视化、时空数据分析等场景。imshow是展示热力图最直接的方法,配合colorbar可以清晰展示数据值的高低分布。
# 热力图示例 —— 相关性矩阵
np.random.seed(42)
n_vars = 6
corr_matrix = np.random.randn(n_vars, n_vars)
corr_matrix = corr_matrix @ corr_matrix.T # 使矩阵对称正定
# 归一化到[-1, 1]范围
d = np.sqrt(np.diag(corr_matrix))
corr_matrix = corr_matrix / np.outer(d, d)
labels = ['特征A' , '特征B' , '特征C' , '特征D' , '特征E' , '特征F' ]
fig, ax = plt.subplots(figsize=(9, 7))
im = ax.imshow(corr_matrix, cmap='RdBu_r' , vmin=-1, vmax=1, aspect='auto' )
ax.set_xticks(range(n_vars))
ax.set_yticks(range(n_vars))
ax.set_xticklabels(labels)
ax.set_yticklabels(labels)
ax.set_title('热力图 —— 特征相关性矩阵' )
# 在每个格子中标注数值
for i in range(n_vars):
for j in range(n_vars):
ax.text(j, i, f'{corr_matrix[i,j]:.2f}' ,
ha='center' , va='center' ,
color='white' if abs(corr_matrix[i,j]) > 0.5 else 'black' )
plt.colorbar(im, ax=ax, shrink=0.8, label='相关系数' )
plt.show()
4.7 饼图 (pie)
饼图用扇形的角度或面积表示各部分占总体的比例。虽然饼图在数据可视化社区中备受争议(因为人眼难以准确比较不同扇区的角度大小),但在展示简单的占比关系时仍然直观有效。建议在类别不超过5个时使用,且避免使用3D饼图。
# 饼图示例
sizes = [35, 25, 20, 12, 8]
labels = ['产品A' , '产品B' , '产品C' , '产品D' , '其他' ]
colors = ['#3498db' , '#e74c3c' , '#2ecc71' , '#f39c12' , '#95a5a6' ]
explode = (0.05, 0.05, 0.05, 0.05, 0.05)
fig, ax = plt.subplots(figsize=(8, 8))
wedges, texts, autotexts = ax.pie(
sizes, labels=labels, colors=colors, explode=explode,
autopct='%1.1f%%' , startangle=90, pctdistance=0.6,
textprops=dict(fontsize=12))
ax.set_title('饼图 —— 产品市场份额占比' )
plt.show()
图表选择指南: 趋势展示用折线图,相关性分析用散点图,分类对比用柱状图,分布探索用直方图或箱线图,矩阵数据用热力图,简单占比用饼图。选择正确的图表类型是有效数据传达的第一步。
五、图形定制
Matplotlib的强大之处在于几乎可以定制图表的每个元素。下面我们逐一介绍标题、标签、图例、网格、刻度和文本注释的定制方法。掌握这些定制技巧,可以让图表从"能用"进化到"专业"。
标题与轴标签
标题和轴标签是图表最基本的标注元素。set_title、set_xlabel、set_ylabel分别设置标题和轴标签。通过fontdict参数可以统一设置字体大小、颜色、粗细等属性。
# 标题与标签定制
ax.set_title('主标题' , fontsize=16, fontweight='bold' , color='#2c3e50' , pad=15)
ax.set_xlabel('X轴标签' , fontsize=12, labelpad=8)
ax.set_ylabel('Y轴标签' , fontsize=12, labelpad=8)
# 也可以使用fontdict统一设置
title_font = {'fontsize' : 16, 'fontweight' : 'bold' , 'color' : '#2c3e50' }
ax.set_title('主标题' , fontdict=title_font)
图例 (legend)
当图表中包含多条数据系列时,图例是帮助读者区分各系列的必备元素。调用legend()方法即可显示图例,通过loc参数控制位置,也可以手动指定图例的列数、边框等外观。
# 图例定制
ax.plot(x, y1, label='正弦' )
ax.plot(x, y2, label='余弦' )
ax.legend(loc='upper right' , fontsize=11, frameon=True,
fancybox=True, shadow=True, ncol=2) # ncol控制列数
# loc常用值:best, upper right, lower left, center 等
网格 (grid)
网格线帮助读者更准确地读取数据点的位置。可以使用grid()方法控制网格的显示与否、线条样式、透明度等。适当的网格可以显著提高图表的可读性。
# 网格定制
ax.grid(True, linestyle='--' , alpha=0.6, color='gray' )
ax.grid(True, axis='y' , linestyle='-' , alpha=0.3) # 仅显示y轴网格
刻度 (ticks)
刻度控制坐标轴上标记的位置和标签文字。set_xticks和set_yticks设置刻度位置,set_xticklabels和set_yticklabels设置刻度标签。对于日期或类别型坐标轴,合理设置刻度可以避免标签重叠。
# 刻度定制
ax.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]) # 设置刻度位置
ax.set_xticklabels(['0' , 'π/2' , 'π' , '3π/2' , '2π' ]) # 设置刻度标签
ax.tick_params(axis='both' , labelsize=10, rotation=45) # 统一调整刻度参数
# 隐藏刻度线
ax.tick_params(bottom=False, left=False)
文本注释 (text / annotate)
在图表中添加文字说明可以帮助读者理解关键数据点或趋势。text()在指定坐标处添加文字,annotate()可以添加带箭头的注释,更适合突出特定的数据点。
# 文本注释
ax.text(2, 0.5, '重要数据点' , fontsize=11, color='#e74c3c' ,
bbox=dict(boxstyle='round' , facecolor='yellow' , alpha=0.3))
# 带箭头的注释
ax.annotate('峰值' , xy=(np.pi/2, 1), xytext=(np.pi/2+0.5, 1.3),
arrowprops=dict(facecolor='black' , shrink=0.05, width=2),
fontsize=11, fontweight='bold' )
六、颜色与线型
颜色和线型是区分图表中不同数据系列的关键视觉元素。Matplotlib提供了丰富的颜色指定方式和线型选择,合理运用可以显著提升图表的可读性和美观度。
颜色 (color)
Matplotlib支持多种颜色指定方式:颜色名称(如'red')、十六进制RGB(如'#3498db')、RGB元组(如(0.2, 0.4, 0.6))、以及单字符缩写(如'r'表示红色,'b'表示蓝色,'g'表示绿色)。使用十六进制颜色码可以获得更精细的颜色控制。
# 颜色指定的多种方式
ax.plot(x, y, color='red' ) # 颜色名称
ax.plot(x, y, color='#3498db' ) # 十六进制
ax.plot(x, y, color=(0.2, 0.6, 0.8)) # RGB元组 (0-1)
ax.plot(x, y, color='r' ) # 单字符缩写
ax.plot(x, y, color='darkorange' ) # CSS颜色名称
线型 (linestyle)
线型控制折线图中线的样式。Matplotlib支持的线型包括实线('-')、虚线('--')、点划线('-.')、虚线点(':')等。也可以通过元组自定义间距,实现任意线型。
# 线型示例
ax.plot(x, y1, linestyle='-' , label='实线' ) # 实线
ax.plot(x, y2, linestyle='--' , label='虚线' ) # 虚线
ax.plot(x, y3, linestyle='-.' , label='点划线' ) # 点划线
ax.plot(x, y4, linestyle=':' , label='点线' ) # 点线
# 自定义线型(间距可调)
ax.plot(x, y, linestyle=(0, (5, 2, 1, 2))) # 5px线+2px空+1px线+2px空
标记 (marker)
标记是数据点位置的符号,在散点图和折线图中均可使用。常见的标记包括圆形('o')、方形('s')、三角形('^')、星形('*')、加号('+')等。markersize控制标记大小,markerfacecolor和markeredgecolor分别控制填充和边框颜色。
# 标记样式
ax.plot(x, y, marker='o' , markersize=6, markerfacecolor='white' ,
markeredgecolor='#3498db' , markeredgewidth=2)
# 常见标记:'o'圆 's'方 '^'三角 'D'菱形 'v'倒三角 '*'星形 'x'叉 '+'加号 '.'点
Colormap(颜色映射)
Colormap用于将数据值映射到颜色,常用于热力图、散点图颜色编码和等高线图。Matplotlib内置了数十种colormap,分为三类:顺序型(sequential,如'viridis'、'Blues')、发散型(diverging,如'RdBu'、'coolwarm')和定性型(qualitative,如'Set1'、'Pastel1')。
# 常用colormap
im = ax.imshow(matrix, cmap='viridis' ) # 顺序型(推荐,色盲友好)
im = ax.imshow(matrix, cmap='RdBu_r' ) # 发散型(带_r表示反转)
im = ax.imshow(matrix, cmap='coolwarm' ) # 发散型
im = ax.imshow(matrix, cmap='Blues' ) # 单色顺序型
# 查看所有可用的colormap
print (plt.colormaps())
颜色选择建议: 优先使用色盲友好的colormap(如viridis、plasma)。对于有零值中点的数据使用发散型colormap(如RdBu、coolwarm)。避免使用jet彩虹色图,因其亮度和色相变化不线性,容易产生视觉误导。
七、保存图形
将绘图结果保存为文件是数据可视化的重要环节。Matplotlib的savefig函数提供了丰富的参数控制输出文件的质量、尺寸和格式。无论是用于论文出版、报告展示还是网页发布,都可以通过调整参数达到理想的输出效果。
# 保存图形的基本用法
fig.savefig('output.png' ) # 默认保存PNG
fig.savefig('output.pdf' ) # 保存为PDF(矢量格式)
fig.savefig('output.svg' ) # 保存为SVG(网页矢量格式)
# 常用参数详解
fig.savefig('plot.png' ,
dpi=300, # 分辨率(默认100,出版要求300+)
bbox_inches='tight' , # 自动裁剪空白边缘
pad_inches=0.1, # 裁剪后留白边
facecolor='white' , # 背景颜色
edgecolor='none' , # 边缘颜色
transparent=False) # 是否透明背景
支持的格式 (format)
savefig支持多种输出格式,每种格式各有特点。PNG是常用的位图格式,适合网页使用;PDF和SVG是矢量格式,缩放不失真,适合论文出版;JPG适合照片类图片;EPS兼容LaTeX出版流程。
# 不同输出格式对比
fig.savefig('output.png' , format='png' , dpi=150, optimize=True ) # 位图,网页常用
fig.savefig('output.pdf' , format='pdf' ) # 矢量,论文出版
fig.savefig('output.svg' , format='svg' ) # 矢量,网页嵌入
fig.savefig('output.jpg' , format='jpg' , quality=95) # 照片类
fig.savefig('output.eps' , format='eps' ) # LaTeX排版
# 批量导出多种格式
for fmt in ['png' , 'pdf' , 'svg' ]:
fig.savefig(f'output.{fmt}' , format=fmt, dpi=200)
最佳实践: 总是使用 bbox_inches='tight' 自动裁剪多余白边;论文图片使用PDF矢量格式,dpi设置为300以上;Web图片使用PNG格式,dpi=150即可;对于需要后续编辑的图表,同时保存一份SVG格式。
八、中文字体配置
Matplotlib默认字体不支持中文,直接使用中文标签会出现空白方块(□□)乱码。解决中文字体显示问题是Python数据可视化中必不可少的一步。这里有三种常用解决方案,推荐使用方法一(全局配置)。
方法一:全局配置 rcParams(推荐)
通过修改matplotlib的全局参数rcParams,可以一劳永逸地解决中文显示问题。同时建议设置字体为sans-serif族,并指定SimHei(黑体)或Microsoft YaHei(微软雅黑)作为默认字体。
# 方法一:全局中文字体配置(推荐)
plt.rcParams['font.sans-serif' ] = ['SimHei' , 'Microsoft YaHei' , 'WenQuanYi Micro Hei' ]
plt.rcParams['axes.unicode_minus' ] = False # 解决负号显示异常
# 此后所有图表都可以直接使用中文
plt.plot(x, y)
plt.title('中文字体测试' )
plt.xlabel('时间' )
plt.ylabel('数值' )
plt.show()
方法二:FontProperties 对象(局部配置)
如果不想修改全局配置,可以为每个需要中文的图表单独指定字体。这种方法更灵活,可以在同一脚本中使用不同字体,但需要为每个文本元素指定fontproperties参数。
# 方法二:使用FontProperties对象
from matplotlib.font_manager import FontProperties
# 指定系统字体路径
font = FontProperties(fname='C:/Windows/Fonts/simhei.ttf' , size=12)
ax.set_title('中文标题' , fontproperties=font)
ax.set_xlabel('X轴' , fontproperties=font)
# 注意:此方法需要在每个文本元素处指定字体,较为繁琐
方法三:查看和检查系统字体
如果配置后仍然无法显示中文,可以检查系统字体列表,确认所需字体是否已安装。同时也可以临时下载字体文件供Matplotlib使用。
# 查看系统可用字体
from matplotlib.font_manager import fontManager
for font in fontManager.ttflist[:10]: # 查看前10个
print (font.name, font.fname)
# 查看所有中文字体
chinese_fonts = [f for f in fontManager.ttflist if 'SimHei' in f.name or 'YaHei' in f.name]
for f in chinese_fonts:
print (f.name, f.fname)
常见错误: 配置rcParams后忘记设置 axes.unicode_minus 为False,导致负号显示为方块。这是中文环境下最容易被忽略的问题。
九、风格设置
Matplotlib内置了多种预定义风格,通过一行代码即可改变图表的整体视觉风格。plt.style.use()可以加载内置风格或自定义风格文件,让图表瞬间拥有专业的外观。
# 查看所有可用风格
print (plt.style.available)
# 输出示例:
# ['Solarize_Light2', 'classic', 'dark_background', 'fast', 'fivethirtyeight',
# 'ggplot', 'grayscale', 'seaborn-v0_8', 'seaborn-v0_8-bright', ...]
# 使用内置风格
plt.style.use('ggplot' ) # 类似R语言ggplot2风格
plt.style.use('seaborn-v0_8' ) # seaborn风格(简洁美观)
plt.style.use('fivethirtyeight' ) # FiveThirtyEight新闻风格
plt.style.use('dark_background' ) # 深色背景适合演示
plt.style.use('bmh' ) # 贝叶斯方法和计算统计风格
plt.style.use('classic' ) # Matplotlib经典风格
临时使用风格
如果只想在特定代码块中应用某种风格,而不影响后续图表的默认样式,可以使用style.context上下文管理器。这种方式在同一个脚本中需要多种风格时非常有用。
# 临时使用风格(上下文管理器)
with plt.style.context('dark_background' ):
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color='#ff6b6b' , linewidth=2)
ax.set_title('深色风格图表' )
plt.show()
# 离开上下文后恢复默认风格
# 混合使用多个风格
plt.style.use(['seaborn-v0_8' , 'grayscale' ])
# 自定义rc参数与风格叠加
plt.style.use('ggplot' )
plt.rcParams.update({'font.size' : 12, 'figure.figsize' : (10, 6)})
常用风格推荐
不同场景适合不同的风格。ggplot和seaborn-v0_8风格最通用,图表美观且信息密度高。fivethirtyeight风格适合数据新闻风格的图表,dark_background适合在演示文稿或深色主题网页中使用。classic风格则保留了Matplotlib早期的外观。
风格机制原理: plt.style.use()本质上是批量修改rcParams参数。所有风格都可以通过查看源码或打印rcParams来了解具体的参数设置。你也可以创建自己的.mplstyle文件来自定义风格。
十、核心要点总结
Matplotlib学习要点
对象模型核心: Figure(画布)包含Axes(子图),Axes是实际绘图区域。牢记这一层级关系是学好Matplotlib的基础。
两种API风格: pyplot(快捷方便,适合交互)和OOP(清晰可控,适合工程代码)。建议在项目中使用OOP风格。
七大图表类型: 折线图(趋势)、散点图(相关)、柱状图(对比)、直方图(分布)、箱线图(分布+异常)、热力图(矩阵)、饼图(占比)。
定制能力: 标题/标签/图例/网格/刻度/文本注释均可精细控制,合理定制让图表从"能用"到"专业"。
颜色系统: 支持名称、十六进制、RGB等多种颜色指定;colormap分为顺序型、发散型、定性型三类。
保存输出: savefig支持PNG/PDF/SVG等多种格式,dpi控制分辨率,bbox_inches='tight'自动裁剪。
中文支持: 设置rcParams的font.sans-serif和axes.unicode_minus为False是解决中文乱码的标准方案。
风格切换: plt.style.use()一键切换整体视觉效果,style.context支持临时风格切换。
学习路径建议: 先掌握基本图表类型和OOP绘图流程,再深入学习图形定制和颜色配置,最后学习保存输出和风格管理。在实战中遇到特定需求时查阅官方文档(matplotlib.org)是最有效的进阶方式。官方Gallery页面提供了数百种图表示例代码,是学习高级技巧的最佳资源。