原文地址 刚开始使用时一样迷惑,感谢原博主解惑,特此记录(注意看评论区)
官方文档
Figure fig = plt.figure()
即画布。画图的第一件事,就是创建一个画布figure,然后在这个画布上加各种元素。
Axes ax = fig.add_subplot(1,1,1)
首先,这个不是画图的xy坐标轴。可以把axes理解为画布上的绘图区域,跟坐标轴axis没有直接关联
如果figure只有一张图,那么就只有一个axes。如果你的figure有subplot,那么每一个subplot就是一个axes。axes下可以修改编辑的变量非常多,基本能包含你的所有需求。
Axis ax.xaxis/ax.yaxis
实际坐标轴。每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。
# 首先创建一块画布
# 这个function创建了一个大小为(14,7)的画布,把这个画布赋值给变量fig
# 同时在这个画布上创建了一个axes,把这个axes赋值给ax
# 这样,所有fig.xxx都是对这个画布的操作,所有ax.xxx都是对这个axes的操作
fig, ax = plt.subplots(figsize=(14,7))
# 在画布上画图
# 注意,这里依然不使用plt!因为要在这个axes上画数据,因此就用ax.plot()来画
# 画完第一个再call一次,再画第二个
ax.plot(A,B)
ax.plot(B,A)
# 首先把标题和xy坐标轴的标题搞定。不用plt,直接在axes上进行设定
ax.set_title('Title',fontsize=18)
ax.set_xlabel('xlabel', fontsize=18,fontfamily = 'sans-serif',fontstyle='italic')
ax.set_ylabel('ylabel', fontsize='x-large',fontstyle='oblique')
ax.legend()
# 然后是xy坐标轴的一些属性设定, 也是在axes level上完成的
ax.set_aspect('equal')
ax.minorticks_on()
ax.set_xlim(0,16)
ax.grid(which='minor', axis='both')
# 最后是坐标轴tick和细节,这个在axes.xaxis or axes.yaxis上完成
ax.xaxis.set_tick_params(rotation=45,labelsize=18,colors='g')
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end,1))
ax.yaxis.tick_right()
首先 matplotlib 架构上分为三层
底层:backend layer
中层:artist layer
最高层:scripting layer
在任意一层操作都能够实现画图的目的,而且画出来还都一样。但越底层的操作越细节话,越高层越易于人机交互。
.plt 对应的就是最高层 scripting layer。这就是为什么它简单上手,但要调细节就不灵了。
ax.plot 是在 artist layer 上操作。基本上可以实现任何细节的调试。
backend layer, 至今,我还没有见有人在这个layer上操作过。
另外,对于axes (翻译就是 坐标系),我看到有个评论写了很多,说的没有错,但也没说到点子上。
如果大家学过大学物理的话,会知道每一个物体都有一个独立的坐标系。
而matplotlib 就是引用这一理念。所以在artist layer上画多条曲线时,你会用 ax1.plot, ax2.plot ... 而最后显示在一张图上是因为所有独立坐标系对齐的结果。