对matplotlib的官方文档做一个简单的总结方便查阅。
来源:https://matplotlib.org/stable/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py
首先导入Matplotlib与Numpy:
import matplotlib.pyplot as plt
import numpy as np
一个简单的例子
在Matplotlib中,整个图像为一个Figure对象。
在Figure对象中可以包含一个,或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域,可以是x-y坐标,或极坐标,或x-y-z的3D坐标。
创建一个带有axes的figure的方法:
fig, ax = plt.subplots() # 创建一个带有一个axes的figure
ax.plot([1,2,3,4],[1,4,2,3]) #在axes上画图
直接画图会在当前的axes自动画图,若没有会创建一个axes和它的父figure。所以可以直接:
plt.plot([1,2,3,4],[1,4,2,3])
Figure的成分
这个图可以帮助理解Matplotlib中figure的各种成分。
Figure
Figure指整个图像,可以包含多个Axes。创建Figure的方法如下:
fig = plt.figure() # 没有Axes的空figure
fig, ax = plt.subplots() # 包含一个Axes
fig, axs = plt.subplots(2, 2) # 包含2乘2个Axes
通常是一起创建Figure与Axes,不过也可以先创建Figure之后再添加Axes。
Axes
Axes就是你画的一个plot的区域。一个Figure包含多个Axes,但一个Axes只能在一个Figure里面。
Axes包含几个Axis(坐标轴)对象。每个Axes包含一个标题(set_title()
),x-label(set_xlabel()
)与y-label(set_ylabel()
)。
Axis
Axis即坐标轴,他们负责图表的limits,刻度以及刻度的标签。刻度的位置由Locator
对象来决定,刻度的标签字符串由 Formatter
来形成。Locator
与Formatter
一起形成合适的坐标轴的可视化。
Artist
基本上,Figure上你能看到的所有东西都是一个artist
,甚至包括Figures,Axes等对象。它包括Text
对象,Line2D
对象,collections
对象,...等等。
画图时候的输入
所有的画图函数都可以输入numpy.array
或者numpy.ma.masked_array
。pandas
的对象或者numpy.matrix
有可能不行,所以画图前最好都转化为numpy.array
对象。
面向对象的界面与pyplot界面
有两种方法使用Matplotlib画图:
- 面向对象的方法,创建figures与axes,再调用他们的方法(Methods)。
比如:
x = np.linspace(0, 2, 100)
#虽然在面向对象的方法,但是我们创建figure还是使用`.pyplot.figure`。
fig,ax = plt.subplots() # 创建一个figure与axes
ax.plot(x, x, label = 'linear') # 在axes画图
ax.plot(x, x**2, label = 'quadratic') # 在axes画更多数据
ax.plot(x, x**3, label = 'cubic') # 继续在axes添加……
ax.set_xlabel('x label') # 给axes添加x-label
ax.set_ylabel('y label') # 给axes添加y-label
ax.set_title('Simple Plot') # 给axes添加标题
ax.legend() # 添加legend
- 利用pyplot自动创建与修改figures与axes,利用pyplot的函数来画图。
比如:
x = np.linspace(0, 2, 100)
plt.plot(x, x, label='linear') # 在默认axes画图
plt.plot(x, x**2, label='quadratic') # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
两种方法都可以用来Matplotlib画图,不过通常建议在可交互的plotting(比如Jupyter Notebook)当中使用pyplot方式,在非交互的情况下(如在函数中或者script中)使用面向对象的方式。
创建画图函数
我们有时候会需要用不同的数据重复画同一个图,这时候创建一个函数会非常方便。比如:
def my_plotter(ax, data1, data2, param_dict):
"""
用于画图的一个函数。
参数
----------
ax : Axes
要画的axes
data1 : array
The x data
data2 : array
The y data
param_dict : dict
Dictionary of kwargs to pass to ax.plot
Returns
-------
out : list
list of artists added
"""
out = ax.plot(data1, data2, **param_dict)
return out
之后可以这么使用:
data1, data2, data3, data4 = np.random.randn(4,100)
fig,ax = plt.subplots(1,1)
my_plotter (ax, data1, data2, {'marker': 'x'})
创建两个subplots时:
fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})
Backend与Performance
此部分详见原链接。
后端的设置方法有三种:
- The
rcParams["backend"]
parameter in yourmatplotlibrc
file - The
MPLBACKEND
environment variable - The function
matplotlib.use()