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页面提供了数百种图表示例代码,是学习高级技巧的最佳资源。