技能matplotlib
M

matplotlib

用于完全定制的底层绘图库。当你需要对每个绘图元素进行细粒度控制、创建全新的图表类型或集成到特定的科学工作流程中时使用。可导出为 PNG/PDF/SVG 以用于论文发表。若用于快速的统计图表使用 seaborn;若用于交互式图表使用 plotly;若用于具备期刊风格、可直接用于发表的多面板图表,使用 scientific-visualization。

Matplotlib - Python 数据可视化绘图库完整指南

技能概述

Matplotlib 是 Python 基础可视化库,用于创建静态、动画和交互式图表,提供从简单折线图到复杂出版级科学图表的完整绘图解决方案。

适用场景

  1. 科研论文与学术出版:创建符合期刊要求的多面板科学图表,支持 PNG、PDF、SVG 等高质量导出格式,适合投稿和演示
  2. 数据分析与探索:在 Jupyter Notebook 中进行交互式数据可视化,支持快速生成折线图、散点图、热力图等多种图表类型
  3. 定制化图表开发:需要精细控制每个图表元素(颜色、字体、布局),或开发新颖的可视化类型,集成到特定科学工作流中

核心功能

  1. 多样化图表类型:支持折线图、散点图、柱状图、直方图、热力图、等高线图、箱线图、小提琴图等常见图表类型,以及 3D 曲面图和 3D 散点图等高级可视化
  2. 双层 API 设计:提供 pyplot 接口(MATLAB 风格)用于快速绘图,和面向对象接口(Figure/Axes)用于复杂图表的精细控制,满足从简单到高级的各种需求
  3. 专业样式与导出:内置样式表和 rcParams 配置系统,支持 300 DPI 高分辨率导出、透明背景、矢量格式(PDF/SVG),确保图表达到出版质量标准

常见问题

matplotlib 如何设置中文显示?

中文显示问题通常需要配置字体。可以通过以下方式解决:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

如果系统缺少中文字体,可以安装对应的字体包或使用其他包含中文的字体。

matplotlib 和 seaborn 有什么区别,该用哪个?

matplotlib 是底层绘图库,提供精细控制但代码量较多;seaborn 基于 matplotlib,提供高级统计图表接口,代码简洁但定制性较弱。选择建议:

  • 快速统计图表:用 seaborn
  • 出版级定制图表:用 matplotlib
  • 复杂多面板布局:用 matplotlib 面向对象接口
  • 可以两者结合使用,seaborn 绘图后用 matplotlib 微调

如何保存高分辨率图片用于论文投稿?

使用 savefig() 方法并设置合适的参数:

fig.savefig('figure.png', dpi=300, bbox_inches='tight', facecolor='white')

关键参数:

  • dpi=300:出版级分辨率(网页用 150,屏幕用 72)
  • bbox_inches='tight':自动裁剪多余空白
  • facecolor='white':确保白色背景
  • 支持导出为 PDF/SVG 矢量格式,保证放大不失真

如何在 Jupyter notebook 中使用 matplotlib?

首先安装交互式后端:

uv add matplotlib ipympl

在 notebook 中运行:

%matplotlib widget  # 或 %matplotlib ipympl

这样图表可以在 notebook 中交互式缩放和操作。如果不需要交互,使用 %matplotlib inline 即可。

matplotlib 适合交互式可视化吗?

matplotlib 主要设计用于静态图表和动画,虽然支持基本的交互功能(如缩放、平移),但对于复杂的交互式可视化(如悬停提示、动态更新),建议使用 plotly 或 bokeh 等专门的交互式可视化库。matplotlib 更适合生成最终输出的静态图表。

如何创建多子图布局?

matplotlib 提供三种布局方式:

  1. 规则网格:plt.subplots(2, 2) 创建 2×2 网格
  2. 马赛克布局:plt.subplot_mosaic() 灵活排列子图
  3. GridSpec:最大控制力,精确指定每个子图位置

面向对象接口推荐使用 constrained_layout=True 自动处理子图间距,避免元素重叠。