请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3364821 新帖:19

matplotlib 数据可视化 - 入门概念

美联储发表于:5 月 10 日 00:40回复(1)

该文章是本人的学习笔记,笔记为原创,内容为参考(^__^) 嘻嘻……

matplotlib 架构¶

matplotlib 的架构分为以下三层

  • Scripting (脚本)层
  • Artist (表现)层
  • Backend (后端)层

它们之间的访问关系是:

Scripting 访问 Artist, Artist 访问 Backend

各层级的作用¶

Backend 为最底层,即 matplotlib API 层,包含的元素有:

  • FigureCanvas 对象实现了绘图区的概论
  • Renderer 对象在FigureCanvas 上绘图
  • Event 对象处理用户输入(键盘和鼠标事件)

Artist 层拥有许多可视化元素,即标题、轴标签、刻度等元素。Aitist 类分为两种:原始(primitive)和复合(composite),即单元素的使用和多元素组合使用。

  • Figure
    • Axes
      • Text
      • Y-axis
        • Y-ticks
        • Y-label
      • X-axis
        • X-label
        • X-ticks
      • Line2D

Artist 最上层是 Figure 层,表示图形概念; Axes 在 Figure 上面,表示轴的作图的内容(即轴对象),每个维度会有一个 Axes 对象;Axis 用来展示 Axes 上的数值(即刻度与刻度值),刻度的位置用 Locator 对象管理,刻度的标签的格式用 Formatter 对象调整。

Scripting 层包含 pylabpylot 模块,这将是重点学习的内容,不过 pylab 暂不介绍

使用 pylot 生成一幅简单的交互式图像¶

'''首先导入pylot模块'''
import matplotlib.pyplot as plt
'''调用plot()函数'''
plt.plot([1, 2, 3, 4])
'''调用show()函数,显示图像'''
plt.show()

注意,如果是在QtConsole环境中时,不用show()函数也可以显示图像

解析:

plot()函数需要知道x、y值的对应关系,才能画出图像,上例中只传入了一个列表,plot会将其当作y的值,而x的值会默认取0、1、2……的递增数值与y值进行对应,便形成了上图的结果

下面,我们为plot()分别指定x与y的值

plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7])
plt.show()

线条的默认颜色是蓝色的,可以尝试改变它的颜色:

plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
plt.show()

好了,从上面的例子,已经摸索出:第一个参数的列表表示x轴的数据,第二个参数的列表表示y轴的数据,第三个参数表示的是线条的颜色可。

另外,观察到,x/y轴的刻度值是随着数据自动匹配的,那如何手动匹配呢?可使用axis()函数来设定刻度的范围:

plt.axis([0,8,0,10])
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
plt.show()

可以看到,线条的形状不变,但它所在的位置发生了变化,因为刻度变了,axis()中的参数是个列表,列表[xmin, xmax, ymin, ymax]中的元素分别指定x轴的最小与最大值,y轴的最小与最大值。

顺便说一下,title()函数可以为图表添加标题:

plt.axis([0,8,0,10])
plt.title('我的标题')
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
plt.show()

x和y轴数据虽然可以传入列表,实际上在使用的时候会被转换成numpy类型,所以可以直接传入numpy类型作参数,效率会更高。

另外再提一下,第三个参数除了可以指定颜色外,还可以指定画图像的形状:

plt.axis([0,8,0,10])
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'ro')
plt.show()
'''导入math和numpy'''
import math
import numpy as np

'''生成0到2.5,间隔为0.1的数列'''
t = np.arange(0,2.5,0.1)
'''
math.pi指圆周率,这里将t中的所有元素乘以圆周率后,
依次作用于math.sin函数上,并返回一个可迭代序列
'''
y1 = list(map(math.sin,math.pi*t))
'''用法同上,只是将t乘以圆周率的值再加上math.pi/4的值,表示偏移量'''
y2 = list(map(math.sin,math.pi*t+math.pi/4))
'''用法同上,这里的偏移量是负数'''
y3 = list(map(math.sin,math.pi*t-math.pi/4))
'''画图'''
plt.plot(t,y1,'b*',t,y2,'g^',t,y3,'ys')
plt.show()

解析:

来看一下plot()的使用语法

Signature: plt.plot(*args, **kwargs)
Docstring:
Plot y versus x as lines and/or markers.

Call signatures::

    plot([x], y, [fmt], data=None, **kwargs)
    plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)

The coordinates of the points or line nodes are given by *x*, *y*.

其中plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)指出了可以连续使用多个x/y/fmt参数来同时画多个图形。

根据上例,可得知,fmt参数,第一个字母表示颜色,字母后面的字符表示形状,b*则表示的是蓝色的星号,g^表示的则是绿色的三角,ys表示的是黄色的方块。

再看个例子:¶

plt.plot(t,y1,'b--',t,y2,'r.',t,y3,'g+')
plt.show()

是不是很奇妙O(∩_∩)O哈哈~

了解 plot() 的参数¶

在上面的例子里,已经看到plot()的语法是plt.plot(*args, **kwargs),可见,可以传入列表与字典类型的参数,列表类型的参数已经在上面的各例中使用过了,那字典类型的参数如何使用呢?

字典类型的参数又叫关键字参数,又称kwargs,在plot()的使用中,关键字参数一般用来设置相关属性,比如下面的例子中,设置线条的粗细:

plt.plot(t,y1,linewidth=5.0)
plt.show()

linewidth相关于key,5.0则是value,能过这种一一对应关系,来指定线条的粗细。

处理多个 Figure 和 Axes 对象¶

这里想表达的是,在一个图形 Figure 中,使用多个图例 Axes;那如何实现呢?先看下例子,然后再作解析:

t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)
plt.subplot(211)
plt.plot(t,y1,'b-')
plt.subplot(212)
plt.plot(t,y2,'r*')
plt.show()

解析:

首先生成了x与y的数据

t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)

subplot()函数,可以将图形分为不同的绘图区域,参数中的211指的是:按垂直方向分成2份,按水平方向分成1份,当前可被控制的是第1个区域

plt.subplot(211)

然后对第一个区域进行绘图

plt.plot(t,y1,'b-')

如果想在第二个图上进行绘图,需要将控制指令切换到第二个区域,使用subplot(212)来指定第三个参数值为2,即控制第二个区域

plt.subplot(212)

最后,在第二个区域上绘图,并显示所有

plt.plot(t,y2,'r*')
plt.show()

接下来再看一下如何将图分成左右两个区域:

t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)
plt.subplot(121)
plt.plot(t,y1,'b-')
plt.subplot(122)
plt.plot(t,y2,'r*')
plt.show()
 

全部回复

0/140

达人推荐

量化课程

    移动端课程