写在前面:好久没用到matplotlib,最近用到的时候发现有些点已经忘了还得查资料,所以趁此机会把matplotlib中常用到的画图方法总结一下!
matplotlib 官网
matplotlib是python中非常实用的一个模块,可以使用matplotlib绘制各种各样的图形,比如折线图、散点图、直方图、条形图、饼图、雷达图等。在python中安装和导入matplotlib包如下:
# 安装
pip install matplotlib
# 导入
import matplotlib.pyplot as plt
# 查看安装包的版本
matplotlib.__version__
一、matplotlib的图形构成
Figure:是指整个图形,也就是一张画布,包括了所有的元素,如标题,轴线等;
Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区;
Axis:是指图形的水平轴和垂直轴,包括轴的长度、轴的标签和轴的刻度等;
Artist:在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等。
Q:在画图时会经常遇到plt.plot 和ax.plot ,这两者的效果都是一样的,那么这两者有什么区别呢?
A:
figure 是上图中红色的外框,可以理解为一整张画布,而axes是蓝色的框,是画布中的一块子图,当需要画一张图形时,既可以用plt.plot()也可以用ax.plot()实现。
再比如上图,figure就是上图中的一整张画布,而Axes就是其中的子图,所以画图其实是在Axes上进行的。上图可以用一下代码来实现:
plt.figure()
plt.gcf.subplots(2,2)
.gcf() 就是获取当前的figure,即get current figure,另外 .gca() ,是获取当前的Axes,即get current axes.
另外 比如plt.plot()、plt.bar() 等,本质上还是在Axes上画图,可以理解为:现在figure上获取一个当前要操作的Axes,如果没有则自动创建一个并将其设置为当前的Axes,然后在这个Axes上执行当前的绘图操作,plt.xxx() 就相当于 plt.gca().xxx
二、绘制图形的各种要素
下面就从折线图说起,来了解绘制图形的各种要素
1、plt.figure()
在绘制图形时,首先用 plt.figure() 绘制一张画布 figure,可以将此figure命名为fig,此时的figure是空白的,后面可以在figure上绘制一个或者多个子图像。
用ax = fig.add_subplot() 向figure中添加Axes,并命名为ax,此后绘制子图就在ax中,就可以给子图ax设置各种属性。
例如:
# create data
A1 = np.arange(1, 6) # x ∈ [1,5]
A2 = np.arange(1, 11) # x ∈ [1,10]
B = A1 ** 2
C = A1 ** 3
D = A2 ** 2
# create figure and axes
fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(212)
# plot data
ax1.bar(A1, B)
ax2.scatter(A1, C)
ax3.plot(A2, D)
plt.show()
不过更好用的方法是 fig, axes = plt.subplots(),在创建画板的同时也将画布赋给了 axes,比上面的 add_subplot 要方便不少。
plt.figure() 调用方法:
plt.figure(num=None, figsize=None, dpi=None,
facecolor=None, edgecolor=None, frameon=True,
FigureClass=<class 'matplotlib.figure.Figure'>,
clear=False, **kwargs)
文档:链接
参数说明:
num:当给一个数字时,相当于figure的编号,相当于ID,当是字符串时,就作为figure的名称;
figsize:指定画布的大小,(宽度,高度),单位为英寸;
dpi:指定绘图对象的分辨率,即每英寸多少个像素,默认值为80;
facecolor:背景颜色;
edgecolor:边框颜色;
frameon:是否显示边框;
例如:
# 创建一个名为panel的figure,大小是3*2英寸,背景颜色时灰色
plt.figure(num='panel', figsize=(3,2),facecolor='gray')
plt.show()
2、plt.subplot()
当有一个空白画布时,可以用 subplot 划分多个子区域进行绘图。将画布整个区域分为 nrows 行,ncols 列,subplot 的 index 参数将指示当前绘制在第几个区域。区域编号的顺序从上之下,从左至右。
plt.subplot(nrows, ncols, index, **kwargs)
文档:链接
plt.figure(num='panel', figsize=(8,4),facecolor='gray')
# 划分三个小区域,绘制出第一个和第三个区域
plt.subplot(1,3,1) # 划分1行3列,第1个子区域
plt.subplot(1,3,3) # 划分1行3列,第3个子区域
plt.show()
有时候需要绘制的子图大小是不一样的,这时就需要对figure进行多次划分,每一次划分后将子图安置在合适的位置即可。注意!前一次的划分是不影响后一次的划分,比如前一次将figure划分为22,不影响下一次将figure划分为21,只需要将子图安置在划分后的空白区域即可。
例如:
plt.figure(num='panel', figsize=(8,4),facecolor='gray')
plt.subplot(2,2,1) # 划分2行2列,第1个子区域
plt.subplot(2,1,2) # 划分2行1列,第2个子区域
plt.show()
4、plt.subplots()
最常用的就是 subplots,便于绘图时精调细节信息。如果用 subplots 创建了多个子图,那么 axes 就是一个 list,用索引列表元素的方法就能获取到每一个 axes。
# create data
A = np.arange(1,5)
B = A**2
C = A**3
# create figure and axes
fig, axes = plt.subplots(1, 2, figsize=(6,3))
# plot data
axes[0].plot(A,B)
axes[1].scatter(A,C)
plt.show()
由于axes是list,可以通过索引,因此也可以在循环中使用。
4、使用matplotlib的两种方法
通过上面的了解,可看出对matplotlib的使用有两种基本的方法:
1⃣️创建figure和axes,并在其上面调用方法(面向对象方法 object-oriented (OO) style);
2⃣️通过pyplot创建和管理图形和轴,并使用pyplot函数进行绘图;
下面来通过一个栗子来说明一下:
# 使用OO模式绘图
x = np.linspace(2, 50, 100)
fig, ax = plt.subplots(figsize=(6, 5))
ax.plot(x, x, label='linear')
ax.plot(x, x**2, label='quadratic')
ax.plot(x, x**3, label='cubic')
# 设置x,y轴的标签
ax.set_xlabel('x label')
ax.set_ylabel('y label')
# 设置ax的标签
ax.set_title("Simple Plot")
ax.legend()
# 使用pyplot函数绘图
x = np.linspace(2, 50, 100)
plt.figure(figsize=(6, 5))
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')
# 设置x,y轴的标签
plt.xlabel('x label')
plt.ylabel('y label')
# 设置标签
plt.title('Simple Plot')
# 设置标签的位置
plt.legend()
plt.show()
输出结果如下:
5、润色绘制的图表
绘制的图表为了更加的通俗易懂以及美观,需要在绘制的图表上添加一些配置;以折线图为例,可是设置图片的大小,x、y轴的描述信息,调整x、y轴的刻度,线条的样式(颜色、透明度),标记出特殊的点,将绘制的图片保存到本地,给图片添加一个水印等。下面依次来看一下这些方法要如何实现。
设置图片的大小和保存图片
# 绘制数据
x = np.arange(2, 26, 2)
y