小白才刚开始阅读Matplotlib官方文档-1
应该是黄二白吧,虽然有断断续续地使用matploblib(简称mpl),但是什么都记不住,每次都是要什么直接找度娘,写代码的时间成倍增长。每次找的都是不同的人写的代码,天花乱坠的ax.plot和plt.plot,作为小白的我毫无头绪,生搬硬套,心里虚虚,完全没有掌握天下的感觉。作为一个小白,真是克服了自己的拖延症和惰性,认认真真开始阅读matplotlib的官方文档了(年初就把这个目标写进了今年的计划,现在在开始实现)。
总体框架
作为小白当然是从入门开始慢慢来,先搞清楚总体框架。按照我现在的理解,matplotlib主要就分成两个部分,图像和文字部分。图像部分囊括了包括了所有绘制图像的函数以及为图像美观服务的axis,color,linewidth等部分;而文字部分,主要就是图中的文字标注。但其实后者也是为图像绘制而服务的,二者交叉,分解也不是太明显,我这里的文字部分☞的就仅仅是关于文中数字标注。
Usage Guide
这部分的阅读主要有三点很重要:
- 搞清楚了一个图像的各种组成部分
- plt.plot 和 ax.plot的区别
- 深刻体会小甲鱼常说的那句话:在python中,一切都是对象!!
figure的组成部分
mpl是一个可以创建figure的库,figure是mpl的终极目标。一个图(figure)可以有多个子图(axes), 一个子图有至少2个坐标轴(axis),万一是三位坐标呢。要严格区分axes与axis, axes不是数学上的axis的复数的意思,它就是指一个子图,一个figure中的一个绘图区域。为了明晰图意,图中必要的会有坐标轴–x,y(,z), 坐标轴的刻度线,网格线,标题等等。所有包含在figure里的东西,也包括figure本身,都是artist。
我们可以通过:
fig = plt.figure()
#创建一个figure,这个figure里面默认只有一个axes,这个axes的内容就是figure的全部内容
#可以通过plt.subplot(211)后续添加;设定有两行一列共2个子图,现在先画第一个,返回第一个子图
#上一行代码也可以通过fig.add.subplot(211)有同样的效果,返回对象是第一个子图
fig, ax = plt.subplots()
#同样的创建一个子图,这里只是把plt.subpots(1)的返回值赋予了fig和ax
fig,axes = plt.subplots(22)
#创建一个2行行列共4个子图
plt.plot和ax.plot的区别
二者Matplotlib绘图的两种方式:
plt通过自动管理figure和axes来生成图片;
ax是面向对象语法的产物。python可以通过首先明确生成图和子图,并调用对应带函数对子图进行修改;
可以参考上面的第一行和第二行代码的区别。就像排队买演唱会门票一样,对于plt就像是三流不知名歌手,没什么人气,来一个人卖就一个,完全不知道销量,来一个就画一个,;对于ax, 就像是泰勒斯威夫特的巡演,销量一定,供大于求。主办方要做的就是把演唱会门票塞到每一个排对的人手里就好了。ax就是知道了图的总量,往里面依次塞东西就好了。
官方文档建议,尽量只是用一种方法绘图。建议交互式绘图采用plt, 如jupyter notebook;非交互式的采用面向对象的绘图方法,比如python script。虽然用jupyter较多,但是我莫名觉得用非交互的方法很好记,但是实际上二者差别不大,基本上你看得到ax.set…之类的就是非交互式的绘图方法了。
python:面向对象的一切
面向对象的一切是指一切东西都有返回值;如果没有,都会返回None。所以,每一个artist都可以用通过返回的artist对象本身来修改其属性;
plt.setp(artist对象,linewidth,color,…) (setp是set_property的简称)
并且还有一些图是只能通过返回的artist对象来设置的,比如:
markline,stemlines,baseline = ax.stem(data,)
具体的还是看看官方文档吧!
官方文档的这一部分还包括了后端、渲染等等,我觉得我暂时还用不上,看了个大概,要是以后有需要还会自己钻研,现在还是能力不够,而且也没有需要,偷偷懒=_=
Pyplot tutorial
Introductory 这一部分就开始简单绘图了,讲述内容集中在2D图的绘制方法,以及其相关属性,并初步涉及了text。我就不pose主要的内容了,记录一下我新学到的知识。
-
plt.plt()只输入一个数据对象,则把其当作为y值,x值默认从0开始,逐1增加;
-
Matplotlib 的输入数据最好是np.array, 对于list输入在部分数据操作上可能出现问题;并且,Matplotlib会在函数绘制中把list自动转换成np.array
-
plt.plot (ax.plot) 不仅仅可以绘制线形图,还可以绘制散点图;并且,在散点属性较为情况下,采用plot比用scatter更快。
-
用关键字绘图。当采用data关键字时,绘图时自动提取列名为对应参数的列值作为输入数据。
data = {'a': np.arange(50), 'c': np.random.randint(0, 50, 50), 'd': np.random.randn(50)} data['b'] = data['a'] + 10 * np.random.randn(50) data['d'] = np.abs(data['d']) * 100 plt.scatter('a', 'b', c='c', s='d', data=data) plt.xlabel('entry a') plt.ylabel('entry b') plt.show()
结语
嗯,今天还读了stem, boxplot的绘制方法,一点一点地啃,发现理解得更透彻了。好像还突然打开了新世界的大门,tranform这个东西读了个半懂不懂,反正就是在fig、axes、display之间相互转换,要是想看看想学学怎么画线的阴影的朋友可以读一读transformation tutorials的相关文档。(剧透,用transforms.offset_copy(ax.transData,fig=fig, dx, dy, units=‘inches’) 把像素点大小转换成data unit大小并在图中绘出,跟shapely的parallel有点像)。
我还会继续读下去的,努力做一个政府matplotlob,绘图时键盘飞快的小强人。。。(先挖坑)。