【Python绘图】matplotlib:先搞明⽩plt.ax.fig再画
我这个傻⼦的matplotlib学习过程很神奇:
刚开始,⼏个教程,呕吼,简单,plt.*** ⼀顿写。画完了。遇到坐标啊之类的细节不会调?
打开⾕哥,要啥搜啥。
我最开始觉得这样蛮好的,这是⼀个很容易学的lib嘛。
然后问题出现了,matplotlib最烦⼈的地⽅就是,同样⼀个⽬标,你可以有N种不同的⽅法去实现他。⽐如说哦,加标题:
plt.set_title() 可以吧。
ax.title.set_text('title') 也可以吧。
ax.set_title()也可以啊。
所以到底要⽤哪个??
当你在⽹上搜索答案的时候,你会遇到各种实现的⽅法,如果你只是单纯的把到的答案copypaste,那总有⼀天你会和我⼀样崩溃。感觉⾃⼰就是个没有⾕哥就不会画图的傻⼦。。。
所以,如果你:
学习matplotlib的时候是从标题类似于"五分钟教你matplotlib画图” 这种教程开始的
起码知道这⼀句 'import matplotlib.pyplot as plt'
遇到稍微复杂的细节就要⼀顿查,遇到修改xy坐标,名称,等等就头⼤
打开matplotlib的官⽅指南,不⽌⼀次,但是⼀脸懵逼
在这⼏个词 figure, axes, axis 在matplotlib出现时就⼀脸完了的表情
那么你不是⼀个⼈。我⼀直和你在⼀起。
所以这份指南是⽤来(尝试)解决这个问题的。我们花短短的时间,来从根本上了解⼀下matplotlib的架构,各种名词是什么意思,⼀个正常的画图程序是什么。
plt.***和ax.***的区别
我认为所有不先讲清楚plt.***和ax.*** 两种画图⽅式的区别的教程都是耍流氓。⼀上来就告诉你,plt.figure(), plt.plot(), plt.show(),这么画就对了的,都是不负责任的表现!
在matplotlib中,有两种画图⽅式:
plt.figure(): plt.***系列。通过来画图,其实是取了⼀个捷径。这是通过matplotlib提供的⼀个api,这个plt提供了很多基本的function可以让你很快的画出图来,但是如果你想要更细致的精调,就要使⽤另外⼀种⽅法。
plt.figure(1)
plt.subplot(211)
plt.plot(A,B)
plt.show()
fig, ax = plt.subplots(): 这个就是正统的稍微复杂⼀点的画图⽅法了。指定figure和axes,然后对axes单独操作。等下就讲
figure和axes都神马意思。
fig, ax = plt.subplots()
ax.plot(A,B)
⼤部分的新⼿教程,都是以开始的。我个⼈认为这不是⼀个很好的⽅式。的确, 简单易懂上⼿快,但是plt把matplotlib的结构看成⼀个blackbox,新⼿在不知道这个lib到底是如何运作的情况下以为⾃⼰上⼿了,可是当你需要细调你的图的时候,你就发现你完全不明⽩⽹上的⼈为什么要⽤, 为什么还有其他那么多种⽅式来加题⽬。这样的学习过程是⾮常不利于长期发展的。
因此,从我这个傻⼦的经验,我强烈建议在初学matplotlib的时候,尽量避免使⽤系列。当你明⽩figure/axes/axis都是控制什么的时候,如果你想要简单的制作⼀个quick and dirty的图,⽤才是OK。
名词解释 in matplotlib
matplotlib的名词定于对于⾮英语母语的⼈来说实在是太不友好了。尤其是axes。仰天长啸。
从官⽅借了个图
Figure fig = plt.figure(): 可以解释为画布。
画图的第⼀件事,就是创建⼀个画布figure,然后在这个画布上加各种元素。
Axes ax = fig.add_subplot(1,1,1): 不想定义,没法定义,就叫他axes!
⾸先,这个不是你画图的xy坐标抽!
希望当初写这个lib的时候他们⽤⼀个更好的名字。。。
python新手代码画图可以把axes理解为你要放到画布上的各个物体。⽐如你要画⼀个太阳,⼀个房⼦,⼀个车在画布上,那么太阳是⼀个axes,房⼦是⼀个axes,etc。
如果你的figure只有⼀张图,那么你只有⼀个axes。如果你的figure有subplot,那么每⼀个subplot就是⼀个axes
axes是matlibplot的宇宙中⼼!axes下可以修改编辑的变量⾮常多,基本上能包含你的所有需求。
Axis ax.xaxis/ax.yaxis: 对,这才是你的xy坐标轴。
每个坐标轴实际上也是由竖线和数字组成的,每⼀个竖线其实也是⼀个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进⾏编辑就会修改xaxis图像上的表现。
图像的各个部位名称
再从使⽤指南 借个图。每个部分的名称指南,这样当你想修改⼀个部位的时候,起码知道关键字啊。
⼀步⼀步来,⽤传统⽅法画个图
下⾯就是实战。⽤调取ax的⽅式来画个图。不要⽤plt!!
Import library and data for ploting
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
A = np.arange(1,5)
B = A**2
C = A**3
⾸先,搞个画布
我喜欢⽤这个命令来开始画图。哪怕你没有subplot,也可以⽤这个subplots来创建⼀个画布。
如果你有两个图,那么ax是⼀个有两个元素ax[0],ax[1] 的list。ax[0]就对应第⼀个subplot的ax。
fig, ax = plt.subplots(figsize=(14,7))
# fig, ax = plt.subplots(2,1,figsize(14,7))
# ax[0].***
# ax[1].***
好了画布搞好了,画数据。
注意,我们这⾥依然不使⽤plt!因为我们要在这个axes上画数据,因此就⽤ax.plot()来画。画完第⼀个再call⼀次,再画第⼆个。
ax.plot(A,B)
ax.plot(B,A)
下⾯开始细节的处理
数据画好了就可以各种细调坐标轴啊,tick啊之类的。
⾸先把标题和xy坐标轴的标题搞定。Again, 不⽤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)
最后是坐标轴tick和细节,这个在axes.xaxis or axes.yaxis上完成。
ax.xaxis.set_tick_params(rotation=45,labelsize=18,colors='w')
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end,1))
ax.yaxis.tick_right()
这样⼀个丑陋的基本图的绘画和编辑就完成了。如果有⼀些其他的细节调整,在搜索的时候,尽量选择不⽤plt的答案。原则上来说,plt和ax画图两者是可以互相转换的,然⽽转换过程让你的代码更复杂,有时还会产⽣难以理解的bug。因此画图的时候,请坚持使⽤⼀种格式。
搞定,吃饭去。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论