简介

Matplotlib是一个功能全面的Python可视化库,用于创建静态、动态和交互式图形。Matplotlib 让简单的事情变得简单,让复杂的事情变得可能。

Matplotlib由神经生物学家John Hunter创建,最初用于处理脑电图 (EEG) 数据。后来,它被许多不同领域的许多人使用和开发。

总的来说,Matplotlib免费开源,可以轻松画出出版级别质量的图表,因为基于Python所以也可以和数据处理的部分结合在同一个项目中。

我完全不用Mac和Linux所以本教程仅适用于Windows。

Python环境

直接安装

Matplotlib基于Python,所以需要先安装Python。

推荐使用Anaconda对Python环境进行管理(跳过此节),但如果你没有使用不同版本进行不同项目或使用众多库的需求,可以选择直接安装Python。

推荐使用Python版本3.11,可以前往这里下载。3.11的支持会持续到2027年的10月,目前对于各种库的适配是最好的,但某些不更新的较旧的库可能需要使用3.9

在安装时勾选Add Python to PATH以避免后续环境变量问题。安装成功后在开始菜单搜索终端打开,输入

1
python --version

如果输出Python的版本则安装成功。如果无法识别或弹出了微软应用商店,则说明环境变量设置存在问题,在开始菜单搜索编辑账户的环境变量打开,在下方你的系统变量里找到PATH,点击编辑,查看是否存在你的Python路径,通常为C:\Users\<你的用户名>\AppData\Local\Programs\Python\Python<版本号>。如果没有,则找到这个路径,在Path里新建一个变量添加进去,并确保它在%USERPROFILE%\AppData\Local\Microsoft\WindowsApps的上方。点击确定保存之后需要关闭并重新打开终端输入刚才的指令进行测试。

Anaconda

前往这里下载,可以翻到最下面选择Miniconda更精简。安装时同样勾选添加到Path方便后续使用,在终端输入

1
conda --version

来检查安装。如果无法识别,在参考上节Python的环境变量编辑,找到你的Miniconda/Anaconda安装目录(通常为C:\Users\<你的用户名>\miniconda3\),将目录下的Scriptscondabin两个文件夹目录添加到Path的变量当中,点击确定保存之后需要关闭并重新打开终端输入刚才的指令进行测试。

安装成功后,在终端中输入

1
conda init

并重启终端,如果每行的开头有一个(base)则初始化成功。

建议配置清华镜像源来加速后面下载:

1
2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

在使用时应当避免污染base环境,创建一个新的环境用于使用Matplotlib:

1
conda create -n <你的环境名> python=3.11

创建成功后,输入

1
conda activate <你的环境名>

终端中开头的(base)应该会变成(<你的环境名>)。后期想要使用此环境都需要使用conda activate <你的环境名>来启用。

安装Matplotlib

无论是直接安装了Python还是使用Anaconda(需要启动对应环境),在终端中输入

1
pip install matplotlib numpy jupyter

numpy是一个数组和运算用库,在绘图中几乎不可能避免使用,推荐在此一起安装。jupyter是一个基于网页的交互式编程工具,在绘图时便于显示和调试。

安装成功后,在终端中输入python打开一个Python环境,输入

1
import matplotlib, numpy, Notebook

如果没有报错即安装成功。

在终端中退出Python环境输入exit()

开发环境

PyCharm

集成开发环境(Integrated Development Environment,IDE) 是一种将代码编辑、调试、运行、版本管理等功能集成在一起的软件工具。你可以下载专门用于Python的PyCharm,可以更方便导入Python环境,以及在IDE内部运行Jupyter Notebook。

在PyCharm内创建项目后,添加新的本地Python解释器为刚刚安装的Python或Anaconda下环境,然后在项目内新建一个.ipynb结尾的文件就可以使用Jupyter Notebook了。

直接使用Notebook

如果不使用IDE,也可以直接在浏览器中使用Jupyter Notebook。在你的项目目录下右键打开终端,切换到conda对应的环境(如果使用了Anaconda),然后输入

1
jupyter Notebook

就会启动一个本地服务器,之后在浏览器访问localhost:8890就可以打开Notebook的网页界面。

JupyterLab

JupyterLab是Notebook的下一代用户界面,在Notebook的基础上提供了一个更灵活的IDE式界面,但依然要在浏览器使用。

安装:

1
pip install jupyterlab

使用:

1
jupyter lab

简单使用

本文只提供一个极其建简易的框架和部分问题的解决方案,了解更多绘图方面细节的话推荐前往Matplotlib文档中的快速入门指南/中文版,这是一个更为合适的入门教程。

显示模式

在Notebook的最开始可以配置Matplotlib的显示模式:

  • %matplotlib inline:静态显示图表,无法交互

  • %matplotlib Notebook:在Notebook内可交互,进行缩放和拖动

    • 仅支持旧版本浏览器访问Notebook,PyCharm或新版Notebook需要使用widget
  • %matplotlib widget:可以和其他jupyter widget是如滑块和按钮结合使用

    • 需要安装ipympl库:在终端中使用pip install ipympl

导入库

无论是在Notebook还是python程序里,你需要先导入numpymatplotlib库:

1
2
import numpy as np
import matplotlib.pyplot as plt

npplt是常用的对于两个库使用的简写。matplotlib还有除了pyplot之外的很多功能,但大多数时候都只会用到pyplot,所以在需要时再导入其他部分。

Notebook可以把代码分成块来运行,可以把导入的部分放在顶部单独一个块运行。

字体设置

在Matplotlib默认配置下,如果直接在labeltitle等位置写中文会显示为方块或乱码,需要设置中文字体。

1
2
3
4
5
6
from matplotlib import rcParams

# 设置全局字体为 SimHei(黑体)
rcParams['font.sans-serif'] = ['SimHei']
# 解决负号显示问题
rcParams['axes.unicode_minus'] = False

Notebook使用

在Notebook中代码可以分块运行,按照运行的顺序会在代码块旁边标注一个[数字]。同一个代码块也可以运行多次。

选中一个代码块时,使用Ctrl+Enter可以运行当前代码块,或者使用Shift+Enter运行并且跳转到下一个代码块。

如果在运行的代码块中有print()或者变量名,又或者是调用了Matplotlib的绘制,会在运行后在代码块下方显示。如果使用了PyCharm,在运行后点击代码块中定义过的变量名,可以像类似调试模式查看变量的内容。

建议将完成一个任务的代码分在一个代码块当中。%matplotlibimport的部分在顶部执行一次即可,定义过的变量也可以在不同的代码块中复用。

数组与numpy数组

绘制图表前通常要将数据处理为数组。Python的数组是以list形式存在的,并且可以多层进行嵌套,比如:

1
matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

就是一个简单的二维数组,可以用matrix[1][2]来访问第2行第3列的值(索引从0开始)。也可以把它转化成一个numpy.ndarray对象,可以进行更方便的索引:

1
matrix = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ])

这样可以直接用matrix[1, 2]来访问第2行第3列,也可以:

  • matrix[:2, :2]:前2行前2列
  • matrix[1:, 1:]:后2行后2列
  • matrix[:, 1]:第2列所有行
  • matrix[matrix > 5]:大于5的所有元素
  • matrix[[0, 2], :]:第1和第3行所有列

进行较为复杂的操作时比使用Python的list要方便很多。

numpy还有很多方便用于绘图的方法:

1
2
t = np.linspace(0, 2 * np.pi, 100)
s = np.sin(t)

np.linspace是生成等间距数组的函数,里面的三个参数分别是起点、终点和点数。np.sin即是直接取t中每一个值的正弦。类似的函数还有很多,基础的数学运算都有对应的函数,具体可以参考numpy的文档/中文版文档

读取文件

如果需要读取文本文件来导入数据,比如Origin的.dat文件或是一般的.csv文件,可以直接用np.loadtxt来读取:

1
2
3
data = np.loadtxt("data.txt")
x = data[:, 0] # 第1列
y = data[:, 1] # 第2列

np.loadtxt默认分隔符是空格或Tab,如果是逗号,需要传入参数delimiter=","。如果文件的首行是标题并且不希望读取,需要传入参数skiprows=1来跳过该行。

绘制图表

首先用plt.figure()新建一个图表窗口,可以指定其大小和分辨率:

1
plt.figure(figsize=(6,5), dpi=100)

这里的figsize是以英寸为单位,dpi就是分辨率,通常不需要手动指定,仅使用plt.figure(figsize=(6, 5))即可。

后面的绘图操作,大多数都可以直接接着调用plt.*来进行绘制,但如果要在一张图里绘制多个子图,Matplotlib提供了面向对象的绘图方式:

1
fig, axs = plt.subplots(2, 2, figsize=(8, 6))

这之后就可以用axs[i, j].*来在第i-1j-1列个子图上进行绘制,而fig是整个图表对应的对象。

简单的图有诸如散点图、折线图、柱状图,可以如下绘制:

1
2
3
plt.scatter(x, y) # 散点图
plt.plot(x, y) # 折线图
plt.bar(x, y) # 柱状图

可以在这里/中文版看到Matplotlib绘制各种图表的示例。

图表中通常还可以加入许多参数来调整样式,如颜色color(简写c)、点的大小size(简写s)、透明度alpha,这些通常也可以是数组的形式,可以在二维的图上增加一个维度的数据。如果需要查看具体的参数设置,可以前往相应图表函数的文档进行查看,或者直接询问大语言模型。

如果是在非Notebook环境下运行,通常还需要再加一个

1
plt.show()

用于显示图像。但在Notebook环境下,每个代码块运行后会自动在下方输出生成的图像。

设置元素

图表中的全部元素都可以设置,通常用得到的是下面几种:

1
2
3
4
plt.set_xlabel("X")    # X轴名称
plt.set_ylabel("Y") # Y轴名称
plt.set_title("title") # 图表标题
plt.legend(loc="best") # 显示图例

plt.legend里的参数不一定要写,只要调用plt.legend()就会显示图例并且默认选择最佳的位置,也可以指定loc到图中的某个位置。更多可以设置的元素可以参考下图:

保存图片

想要保存生成的图表,要在调用plt.show()之前使用

1
plt.savefig("文件名.png")

就会在项目目录内保存相应的图表。也可以指定相对或绝对路径来修改保存的位置,同时文件的格式直接由后缀决定,也可以保存.pdf.svg的矢量图。

除此之外还有几个参数可以使用:

  • dpi:和plt.figure中使用一致设置分辨率
  • transparent=True:将背景设置为透明
  • bbox_inches="tight":控制边界,常用"tight"去掉多余空白