matplotlib 数据可视化 - 入门概念

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()
output_2_0.png

注意,如果是在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()
output_5_0.png

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

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

好了,从上面的例子,已经摸索出:第一个参数的列表表示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()
output_9_0.png

可以看到,线条的形状不变,但它所在的位置发生了变化,因为刻度变了,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()
output_11_0.png

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()
output_13_0.png
'''导入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()
output_14_0.png

解析:

来看一下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()
output_17_0.png

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

了解 plot() 的参数

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

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

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

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()
output_24_0.png

解析:

首先生成了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()
output_27_0.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,123评论 6 528
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,850评论 3 412
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,839评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,389评论 1 308
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,183评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,717评论 1 320
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,797评论 3 436
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,951评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,459评论 1 330
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,431评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,573评论 1 365
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,123评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,823评论 3 344
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,220评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,475评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,155评论 3 387
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,560评论 2 370

推荐阅读更多精彩内容