python可视化——图形系统知识点整理

文章目录

        • 1. python可视化中pylab库与pyplot的关系
        • 2. 函数式绘图与对象式绘图(主要)
          • 2.1 函数式作图
          • 2.2 对象式作图
        • 3. Axes对象与subplot对象的关系
          • 3.1 Subplot
          • 3.2 Axes

python拥有强大的matplotlib可视化库,内容过于丰富,恕不能一一整理。
这篇推文里cd我整理三个比较基础的问题:

  1. python可视化中pylab库与pyplot的关系
  2. 函数式绘图对象式绘图(主要)
  3. Axes对象与subplot对象的关系

1. python可视化中pylab库与pyplot的关系

用python绘图时,经常会看到一些绘图案例。这些例子中是导入绘图库大约有这三种:

  1. import pylab as plt
  2. import matplotlib.pylab as plt
  3. import matplotlib.pyplot as plt

这些例子嘛后面就都用plt.XXX一顿操作,然后运行起来么也都丝般顺滑(cd我因为懒用的都是第一种),所以,这三种方式到底有什么区别?

对于1和2,其实没差别,因为我翻看了一下pylab库的源码,显示如下:

from matplotlib.pylab import *
import matplotlib.pylab
__doc__ = matplotlib.pylab.__doc__

那么对于pylab与pyplot的关系呢?cd我查找一波,发现解答:

pyplot:“方便快速绘图,matplotlib通过pyplot模块提供了一套和MATLAB类似的绘图API,将众多绘图对象所构成的复杂结构隐藏在这套API内部。”
pylab:“pylab包括了许多NumPy和pyplot模块中常用的函数,方便用户快速进行计算和绘图,十分适合在IPython交互式环境中使用。”

综上:三种方式关系为1=2>3(这个大于号不是很严谨,但对于一般操作而言均成立)。意思就是说pylab结合了pyplot和numpy,对交互式使用来说比较方便,既可以画图又可以进行简单的计算。但是,对于一个项目来说,建议分别倒入使用,就是分别导入matplotlib.pyplotnumpy

附matplotlib的资料:
http://matplotlib.org/Matplotlib.pdf (Matplotlib.pdf)

2. 函数式绘图与对象式绘图(主要)

2.1 函数式作图

大家都知道MATLAB语言是面向过程的。在可视化过程中MATLAB利用函数的调用,轻松的利用各种函数命令来绘制直线,然后再用一系列其他函数调整结果。Python的matplotlib库中也提供这样的绘图接口,直接调用matplotlib.pyplot或者pylab就可以实现。
函数式调用很方便。但是matplotlib本质上还是构建对象来构建图像。函数式编程将构建对象的过程封装在函数中,从而让我们觉得很方便。
对于单一图像绘制或者简单效果的实现,这种函数式作图是一种值得推荐的操作方式。

2.2 对象式作图

但是其实很多时候,使用函数式作图时,我们非明白真正作图的实现过程,如果希望能够更好理解python可视化,对象式作图将是一个更好的习惯。

首先我们需要了解一下图像的构成。下面以一张‘五脏俱全’的图像为例。
python可视化——图形系统知识点整理_第1张图片
上图是我特地截图保留下来的,是为了说明,所有axes/subplot都是画在figure上的。
另外如下图:
python可视化——图形系统知识点整理_第2张图片
就是说,figure1是由上图所示的(1-figure/画布)和(2-axes/subplot)构成。我们所有所绘制的图形都是在1-画布上实现的。需要注意的是,我们平时用savefig()保存的都是画布上方的2-axes部分的东西。因此,我们设置的figure的背景颜色并不影响最终保存的图像背景颜色。(上图中,cd我特地将画布的背景颜色调为灰色,默认是白色的。)

然后,我门了解一下对象如何组成2-axes/subplot。(在第三部分再说axes与subplot的关系,下面都拿axes作为讨论的客体。)
一个axes对象里,包含了title, tick, tick label, xaxis, yaxis等对象(数量众多不一一列举)。它们都来自于一个叫做Artist的基类。对于一般的绘图(就是cd我现在遇到的一些对象),我罗列如下的逻辑关系:
python可视化——图形系统知识点整理_第3张图片

上述部分对象在图中的角色如下:
python可视化——图形系统知识点整理_第4张图片

其中需要说一下的是:

  • spin: 指的是axes边框部分,分为上下左右。
  • patch:指的是spin围成的2D区域
  • line:设置线条(颜色、线型、宽度等)和标记
  • ticks:指的是刻度线

cd用对象式作图如下一例子:

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(96996)
data = np.random.rand(20)

fig = plt.figure(1,facecolor = '.8')
ax1 = fig.add_axes([0.15,0.12,0.8,0.8])
ax1.plot(data*5,'-o',ms=10, mfc='orange',label = 'Legend')
ax1.set_xlabel('This is xlabel')
ax1.set_ylabel('This is ylabel')
ax1.set_title('This is title')
ax1.legend(loc = 'best')
ax1.patch.set_facecolor('lightyellow')
ax1.grid(False)
ax1.axis('equal')

ax2 = fig.add_axes([0.68,0.15,0.25,0.25])
ax2.plot(np.sin(np.arange(0,np.pi,0.01)),'-')
ax2.tick_params(axis='both',labelsize=0,direction='in')
ax2.grid(True)

plt.savefig('pic_ex',dpi=150)

结果如下:
python可视化——图形系统知识点整理_第5张图片

平时作图的问题就是,我们不知道要改什么参数来达到对应效果。最近cd我感觉有个除了上网搜的找参数方法,目前觉得挺好用的:
就是查看一下图片的默认参数设置,看看里面有没有需要的参数,然后再对相应的参数进行修改。

import matplotlib.pyplot as plt
plt.rcParams.keys()
#例如改字体可以
#plt.rcParams[’font.sans-serif’] = ‘SimHei’

输入如上命令,相必你总会找到你需要的参数的。

最后,cd我在查找资料的过程中发现一位大佬对matplotlib库的函数式绘图和对象式绘图的笔记,受益匪浅,这里传送一波。http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html#commentform
https://my.oschina.net/swuly302/blog/94805

3. Axes对象与subplot对象的关系

https://www.cnblogs.com/xiaopengli/p/8058408.html

3.1 Subplot
import matplotlib.pyplot as plt
fig1 = plt.figure(1)
ax1 = fig1.add_subplot(121)
ax2 = fig1.add_subplot(122)
plt.show()

python可视化——图形系统知识点整理_第6张图片
可以看到,subplot就是创建子图的意思,前两个数字代表生成几行几列的子图矩阵,最后一个数字代表选中的子图位置。

3.2 Axes
import matplotlib.pyplot as plt
fig2 = plt.figure(2)
ax3 = fig2.add_axes([0.1,0.1,0.8,0.8])
ax4 = fig2.add_axes([0.72,0.16,0.16,0.16])
plt.show()

python可视化——图形系统知识点整理_第7张图片
axes就是在画布上面创建坐标系(轴域)。参数输入的是一个含4个0到1的小数。前两位代表坐标原点所在画布上的位置,后两位代表坐标系在画布上两个方向的长度。axes本身也可以理解为子图。

  • 这两种对象确实是互相相关的,生成subplot的时候,必然会产生一套axes。而当用axes方法生成轴域的时候,我们也可以看成生成一个可以作图的子图(subplot)。
  • 稍微区别的地方在于,用subplot方法产生子图,更简明;用axes方法产生轴域则更加灵活,可以实现坐标轴的叠加。

(subplot就是自动整齐的排列好子图了,axes就是自己手动排“轴域”,就更灵活和麻烦。anyway,cd我喜欢用axes方法。)

(欢迎关注微信公众号cd的实验报告:cdsreport)

你可能感兴趣的:(python可视化——图形系统知识点整理)