一、利用Python进行数据可视化
1.1 初识画图框架
这里我们主要用到的是Python中的matplotlib数据绘图库,可以把大量枯燥的数据进行图形化表示以便于更容易理解数据之间的关系以及数据之间的比对。所以当我们需要用到图形来辅助分析数据时,那么必然要用到此库。像pandas和numpy库一样,使用之前都要先进行声明: import matplotlib.pyplot as plt ,matplotlib的图像都位于Figure对象 中,所以需要用plt.figure创建一个新的Figure对象如以下代码: matplotlib中不能通过空Figure绘图,这里需要理解下figure的概念,在画图的过程中,实际上是分为四层的,第一层:canvas(我们理解为画板),第二层就是:figure了(我们理解为画布或者画图区域),我们需要画画就必须依托于此画板和画布。第三层:Axes(理解为子图或者坐标系)/subplot(理解为子图)。第四层:各类图表信息,包括:xaxis(x轴),yaxis(y轴),title(标题),legend(图例),grid(网格线),spines(边框线),data(数据)等等。这是四层结构。canvas位于最底层,当我们导入matplotlib库时就存在了(无需多管这个),axes建立在figure之上,一个figure可以有多个axes(子图也可理解为坐标系)。可以通过下图更明确的理解:
具体的画画操作还是在画布上完成的,在pyplot中我们通过figure对象添加子图,它所对应的是subplot(子图)此时你可能会疑惑上面不是刚说过一个figure可以有多个subplot(理解为子图或者坐标系)吗?其实我认为可以把subplot和axes理解是一样的东东,往下看可能更清楚些。所以我们要创建subplot,此时可用add_subplot创建一个或多个subplot,以上代码中出现的ax1 = fig.add_subplot(2,2,1),释为:图像应该是2*2的(理解为2行2列),且当前选中的是4个subplot中的第一个(编号从1开始)。
完整的效果图为(此时可以很容易理解上文中的2*2,即两行两列):
由于根据特定布局创建Figure和subplot是一件非常常见的任务,于是便有一种更为简洁方便的方法(plt.subplots—>创建多个子图),它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的numpy数组。这是很实用的方法,因为可以对axes数组进行索引,(就好像是一个二维数组一样例如:axes[0,1],)运行代码:
让我们更细致的去理解下plt.subplots创建多个子图的方法,当然要借助代码更容易理解啦!
这里我们只画了图一,之后又加入图二,若想要理解代码,将部分代码进行改动或注释再看(常常这样做,帮助理解):
以上几种效果图和代码的对比,应该比较清楚了吧,关于arange()函数和range()再次补充下:range(start, end, step),在Python2中返回的是一个list对象,而在Python3中确实返回的是一个range对象,起始值为start(默认从0开始)例如:range(50)等价于range(0,50),终止值为end,但不含终止值,步长为step(默认为1),只能创建int型list。而arange(start, end, step),与range()类似,但是返回一个array对象。需要引入import numpy as np,并且arange可以使用float型数据。自己查了一些资料,然后进行验证。
在python2中:
在python3中:
以上只是对于可视化起初学习过程中的一些小知识的记录(后面会用到哦!)可能还会有所补充,以便日后进行复习。下面让我们看下如何用python画柱形图更直观理解数据。
1.2 示例柱形图(bar)
直接上例子如:
虽然,数据比较简单,但是你能够做到在很短时间内判断出后面y的取值中哪个最大哪个最小吗?非常考察视力!!!
既然如此,让我们用图来表示这些数据,看看结果怎样?
我们对0–9的10个数字设置标签labels = list(“abcdefghij”),与以上10个数字一一对应。
从图中运行结果可以很快判断出:标签h所对应的数字最大。标签i所对应的数字最小。(这里如果觉得不好理解,可以想像为0–9为10个同学,把他们用标签a–j来进行标记,而后面的10个随机y值则可以理解为身体某些指标,这样的话我们可以快速的观察出哪位同学的最高或最低)
2.1matplotlib的 两种作图方式
2.1.1函数式作图 (pyplot)
由于函数式作图是使用经过封装后的函数来作图,所以很多时候函数式作图的操作看起来会比较方便,但是有以下缺点:
1.整个matplotlib包是由一系列有从属关系的对象构成的,函数式作图掩盖了原有的从属关系。
2.个性化定制能力不如面向对象作图的方法强大,因为面向对象作图是最底层的作图方法,几乎能做一切的图,只是操作可能会有些繁琐。
2.1.2面向对象作图 (pyplot)
以上是matplotlib中两种作图方式的对比,面向对象作图首先要先创建一个figure和axes对象,而函数式作图则没有,面向对象作图更有逻辑性,个性化定制能力强一些,但是操作略显复杂。此文讲了使用matplotlib作图需要理解的一些概念,以及作图方式,后续仍会补充。