用python两年多了,然而至今画图时依然会对群魔乱舞的Matplotlib对象感到困惑,尤其是看起来作用都类似的fig,ax和plt以及各种各样的subplot。
我们先来看以下三个示例
# C1
它们看起来非常相似,运行的结果也几乎一样,除了第3个有轻微不同。结果如下:
从结果我们看到,3个代码都在图的左上角区域画了一个直线图,不同的是前两个图把其他区域空了出来,而第3个子图把余下的子区域都分好了。
对代码做下简单的分析
# C1
fig = plt.figure() # figure是matplotlib中最基础的一个对象,是一个总的画布
ax = fig.add_subplot(2,2,1) # add_subplot在画布中添加一个axes(可以理解为子区域),并返回这个子区域
参数的前两个表示子区域的行列数,最后一个表示子区域的顺序
ax.plot([1,2,3]) # 在这个子区域中画图
这里要重点说明一下,matplotlib中,几乎所有的画图操作都是在axes上完成的。
例如查看plt.plot()的源码,实际上是获取当前的axes然后在上面作图。
gca(Get the current axes)
# C2
fig = plt.figure()
ax = plt.subplot(2,2,1) # 和fig.add_subplot作用相同,只是直接调用plt.subplot,会获取当前活跃
的figure对象,然后添加子区域
ax.plot([1,2,3])
# C3
fig, ax = plt.subplots(2,2) # 调用subplots会直接添加多个子区域,返回的ax是一个包含所有子区域的矩阵
ax1 = ax[0,0] # 通过下标获取需要的子区域
ax1.plot([1,2,3])
希望以后再遇到这些奇怪的对象和方法,你可以不用迷惑,具体该选择哪种方法取决于你的习惯。个人建议选择第3种,这种方式最为直观,在子区域很多时也不容易混淆。