9.Matplotlib-绘制子图
image
扫码关注【牵引小哥讲Python】,关注回复【资源】领取学习资源!
原创作者:牵引小哥
微信公众号:牵引小哥讲Python
注:转载或复制请注明出处——牵引小哥
Matplotlib是一个面向对象的绘图库。在实际应用中,常常新建一个Figure对象,作为容器。再在Figure对象中创建Axes对象绘图。这样操作,可以理解为在一张画布(Figure)中创建一张图(Axes),也可以创建多个子图。而且,在对坐标轴刻度、标签等进行自定义操作时,一般也是在Axes对象进行。所以本期小哥将介绍几种简单创建Axes对象绘图的方法。
1. 方法一(add_subplot)
add_subplot(nrows, ncols, index,**kwargs),其中nrows和ncols表示将一个Figure分割为nrows行ncols列,index表示从上,从左数Axes对象所处位置编号(理解有点头疼,没关系,看例子!),**kwargs是一些其他参数,具体可参考官方说明。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
x=np.linspace(0,2*np.pi,100)
fig=plt.figure()
ax1=fig.add_subplot(221)# or (2,2,1),当nrows, ncols, index都小于10时,逗号可省略。
ax2=fig.add_subplot(222)
ax3=fig.add_subplot(212)
ax1.plot(x,np.sin(x))
ax2.plot(x,np.cos(x))
ax3.plot(x,np.sin(x)+np.cos(x))
Figure_1.png
各个子图之间的间距可使用plt.subplots_adjust()进行调整。
如果只需要创建一个Axes对象,如下。
ax1=fig.add_subplot(111)
ax1.plot(ax1.plot(x,np.sin(x)))
Figure_2.png
2. 方法二(subplots)
subplots(nrows=1, ncols=1, sharex=False, sharey=False、、、、、)该函数功能十分强大,更多参数设置可参考官方说明文档。
创建创建一个Axes对象。
fig,ax=plt.subplots()
创建多个Axes对象。
fig, axs = plt.subplots(2,2)
axs[0, 0].plot()
axs[0, 1].plot()
axs[1, 0].plot()
axs[1, 1].plot()
Figure_3.png
还可以设置坐标轴共享。
# Share a X axis with each column of subplots
plt.subplots(2, 2, sharex='col')
# Share a Y axis with each row of subplots
plt.subplots(2, 2, sharey='row')
# Share both X and Y axes with all subplots
plt.subplots(2, 2, sharex='all', sharey='all')
3.方法三(GridSpec)
gridspec.GridSpec(nrows, ncols、、、、),更多参数设置可参考官方说明文档。
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure()
gs = GridSpec(2, 2)
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])
ax3 = fig.add_subplot(gs[2])
ax4 = fig.add_subplot(gs[3])
Figure_4.png
GridSpec也可通过切片试验画布分割。
fig = plt.figure()
gs = GridSpec(3, 3, figure=fig)
ax1 = fig.add_subplot(gs[0, :])
# identical to ax1 = plt.subplot(gs.new_subplotspec((0, 0), colspan=3))
ax2 = fig.add_subplot(gs[1, :-1])
ax3 = fig.add_subplot(gs[1:, -1])
ax4 = fig.add_subplot(gs[-1, 0])
ax5 = fig.add_subplot(gs[-1, -2])
Figure_5.png
小哥Tips:在进行子图区域分割设计时的方法繁多,函数中涉及的参数较为复杂。小哥未能详细讲解,还请见谅!大家可根据小哥提供的官方链接深入学习!