数据可视化(Matplotlib)

蓝色字体为单词,一些我本身认识的单词就再也不罗列,好比font编程

灰色字体为函数的形参,形参在罗列的时候会省略部分默认值,阅读时可跳过灰色部分字体app

棕色部分字体为我本身的疑惑,有待解答,若是你看到以为easy,欢迎留言教教我dom

本章内容基于《Python编程 从入门到实践》,做者Eric Mattheside

【数据可视化】函数

matplotlibPython的一种绘图库,内含许多制做图表的工具工具

15.2绘制简单的折线图】测试

plot  /plɑ:t/  v.以图表画出、绘图字体

figure  /ˈfigjər/  n.图形、图表,人物,数字spa

argsargumentsn.参数(parameter相比,特指实参)scala

kwargsKeyWordArguments n.关键字参数

pyplot模块包含许多生成图表的函数,咱们绘制一个简单的折线图:

 

1 import matplotlib.pyplot as plt
2 squares = [1, 4, 9, 16, 25]
3 plt.plot(squares)
4 plt.show()

 

先从绘图库matplotlib中导入pyplot模块并命名为plt,定义一个数列squares

plt.plot([x] , y , [fmt] , **kwargs)

plt.plot([x] , y , [fmt] , [x2] , y2 , [fmt2] , ... , **kwargs)

#fmtformat的简写,传入该参数可设置表现数据的形式,如'r+'(红十字点)'bo'(蓝色圆点)

plt.plot( )函数会尝试将接收到的数据绘制成有意义的图形,而plt.show( )打开matplotlib查看器并显示绘制的图形

观察得知,plt.plot( )将接收到的数据从04一一映射,并连线绘制成折线统计图

15.2.1修改标签文字和线条粗细】

axis  /ˈæksis /  n.轴,轴心国(其复数形式为axes)

tick  /tik/  v.打钩

param  /.../  n.参数(argument相比,特指形参)

matplotlib容许调整可视化的各个方面,咱们对上图进行改善:

 1 import matplotlib.pyplot as plt
 2 
 3 squares = [1, 4, 9, 16, 25]
 4 plt.plot(squares, linewidth = 5)
 5 
 6 plt.title('Square Numbers', fontsize = 24)
 7 plt.xlabel('Value', fontsize = 14)
 8 plt.ylabel('Square of Value', fontsize)
 9 
10 plt.tick_params(axis = 'both', labelsize = 14)
11 
12 plt.show()

咱们在plt.show( )以前添加一些代码

①在plt.plot( )中添加参数linewidth,修改线条的粗细

plt.title( )能够设置图表标题,经过fontsize参数调整字体大小

plt.title(label , **kwargs)

plt.xlabel( )plt.ylabel( )分别可设置x轴和y轴的标题,及大小

plt.xlabel(xlabel , **kwargs)plt.ylabel(ylabel , **kwargs)

④图表中xy轴的分度值被称为标签plt.tick_params( )首先要求参数axisaxis的选项有3个:'x''y''both',默认为'both';经过肯定参数axis指定对x轴或y轴作出修改;而修改则是经过指定参数labelsize的值

plt.tick_params(axis = 'both' , **kwargs)

15.2.2校订图形】

对于plt.plot( ),正如你所见到的形参有([x] , y , [fmt] , **kwargs),上面只传入了squares一个参数,Python默认赋值给形参中的y

咱们看的图形中的数据并无被正确绘制,缘由在于x轴从0开始;为改变这种默认行为,咱们需同时提供x值和y值:

1 input_values = [1, 2, 3, 4, 5]
2 squares = [1, 4, 9, 16, 25]
3 plt.plot(input_values, squares, linewidth = 5)

15.2.3绘制散点图】

scatter  /ˈskætɚ/  v.散开、分散

有时候,咱们须要绘制散点图,这时须要使用函数scatter( )    plot( )传入fmt参数何异?

plt.scatter(x , y , ... , **kwargs)

1 import matplotlib.pyplot as plt
2 plt.scatter(2, 4)
3 plt.show()

在打开的图形中你会发现点(2 , 4)位于表格的正中央,并被显示以一个蓝色的圆点

咱们还能够经过修改scatter( )的参数来设置输出图形的样式

1 plt.scatter(2, 4, s = 200)

plt.scatter(x , y , s = None , ... , **kwargs)

ssize

scalar  /ˈskeilɚ/  n.数量、标量  adj.梯状的,分等级的

实参s设置了绘制图形时使用的点的尺寸,你会看到一个更大的蓝点在图表中

1 plt.title('Squares Numbers', fontsize = 24)
2 plt.xlabel('Value', fontsize = 14)
3 plt.ylabel('Square of Value', fontsize = 14)
4 
5 plt.tick_params(axis = 'both', which = 'major', labelsize = 14)

以上是对图表的完善,其中的which参数有{'major' , 'minor' , 'both'}选项,分别设置主刻度线、次刻度线以及同时设置

plt.tick_params(axis = 'both' , which = 'major' , ... , **kwargs)

15.2.4使用scatter( )绘制一系列点】    仍是搞不懂与plot( )传入fmt参数的不一样?

较为简单,直接将上述的xy值的类型从int(str)更改成list便可:

1 x_values = [1, 2, 3, 4, 5]
2 y_values = [1, 4, 9, 16, 25]
3 plt.scatter(x_values, y_values, s = 200)

15.2.5自动计算数据】

当要绘制的点不少的时候,手动输入点的数据的效率十分低下,由于可让Python循环来代替:

1 x_values = list(range(1, 1001))
2 y_values = [x*x for x in x_values]
3 plt.scatter(x_values, y_values, s = 40)
4 
5 plt.axis([0, 2000, 0, 4000000])

Python自动生成数列,再将数列绘制到图表上

plt.axis(*v, **kwargs)

函数axis( )接收一个可变参数(*v),因为后面的**kwargs存在,因此可变参数的传入需以listtuple的形式。axis( )接收的*v中包含4个参数,分别是用于设置绘制的图表x轴、y轴的显示范围,即分别为x轴和y轴的最小值和最大值

15.2.6 - 15.2.8函数scatter( )参数】

【数据点的轮廓】

plt.scatter(x , y , edgecolors = None , ... , **kwargs)

书上设置参数为edgecolor,且写明“默认为蓝色点和黑色轮廓”

但在matplotlib官方文档中,参数名为edgecolors;且在篇头指明edgecolors = None,但在篇末又指明edgecolors = 'face'(轮廓与图形颜色一致)

经测试,参数名为edgecoloredgecolors等效;默认不为黑色轮廓,应该为'face'

【自定义颜色】

plt.scatter(x , y , c = None , ... , **kwargs)

ccolor

经过scatter( )绘制的点默认为蓝色,可传递参数c来更改

参数c可为表示特定颜色的字符串,如'red',也可经过RGB来设置

注意,与普通的255*255*255RGB不一样,参数c应设置为30-1的小数值,分别表示红、绿和蓝的份量

1 plt.scatter(x_values, y_values, c = (0.9, 0.9, 0), s = 40)

经检验,值越接近1,颜色越深

【颜色映射】

map  /mæp/  n.地图  v.绘制地图、勘查

颜色映射(colormap)是一系列颜色,从起始颜色渐变到结束颜色

颜色映射用于突出数据的规律,可使用较浅的颜色来显示较小的值,用较深的颜色显示较大的值

plt.scatter(x , y , cmp = None , ... , **kwargs)

1 plt.scatter(x_values, y_values, s = 40, c = y_values, cmap = plt.cm.Blues)

咱们将参数c设置为一个y值列表,即颜色映射的值取自列表y_values;随后传递cmap参数,其告诉pyplot使用哪一个颜色进行映射

注意:映射时的参数c所含元素的数目必须与绘制的点的数目相同

传递cmap参数为plt.cm.Blues后,值较小的点将显示为浅蓝色,值较大的点将显示为深蓝色

'Blues'只是一种颜色映射,若是想了解全部的颜色映射,路径为:

访问http://matplotlib.org/ → 单击Example → 找到Color选项 → 'Colormap Reference'

15.2.9自动保存图表】

咱们经过plt.show( )来展现图表,而若是要让程序自动将图表保存到文件中,可替换为:

1 plt.savefig('scatter_squares.png', bbox_inches = 'tight')

plt.savefig(fname , bbox_inches = None)

figfigure

fnamefile name

bboxbounding box(边界框)

经过savefig( ),第一个实参指定要保存图表的文件名;而关键字参数bbox_inches{'None' , 'tight'}选项,若是指定'tight',会将图表多余的空白区域裁剪掉,这样能够生成一个适中的图表

文件将储存到代码文件所在的目录中

15.3随机漫步图】

从点(0 , 0)开始,随机地移动某个方向若干距离,记录移动后的点;再在该点上继续随机移动。将全部的点绘制到图表上,得到随机漫步图

15.3.1建立RandomWalk类】

 1 from random import choice
 2 class RandomWalk(object):
 3     def __init__(self , num_points = 5000):
 4         self.num_points = num_points
 5         self.x_values = [0]
 6         self.y_values = [0]
 7 
 8     def fill_walk(self):
 9         while len(self.x_values) < self.num_points:
10             x_direction = choice([1 , -1])
11             x_distance = choice([0 , 1 , 2 , 3 , 4])
12             x_step = x_direction * x_distance
13 
14             y_direction = choice([1 , -1])
15             y_distance = choice([0 , 1 , 2 , 3 , 4])
16             y_step = y_direction * y_distance
17 
18             if x_step == 0 and y_step == 0:
19                 continue
20 
21             self.x_values.append(self.x_values[-1] + x_step)
22             self.y_values.append(self.y_values[-1] + y_step)

建立RandomWalk类要确立3个属性:漫步次数(num_points)、横坐标、纵坐标

咱们使用x_valuesy_values分别存储点的横坐标和纵坐标的值,并规定一开始从(0 , 0)点开始。经过choice( )分别为xy选择方向(direction)、距离(distance),明确下一个点要作出的漫步

if x_step == 0 and y_step == 0: continue代码行代表咱们不接受原地漫步

最后经过x_stepy_step分别与上一个点相加,得出漫步后的点的坐标,并存储

至此,当建立实例rw并调用rw.fill_walk( ),实例rw就拥有了2个长度为5000的列表,列表中的值除(0 , 0)外彻底随机

15.3.2绘制随机漫步图】

既然rw能够拥有2个长度为5000的列表,那么绘制图表就十分简单了

1 from random_walk import RandomWalk
2 import matplotlib.pyplot as plt
3 
4 rw = RandomWalk()
5 rw.fill_walk()
6 plt.scatter(rw.x_values, rw.y_values, s = 5)
7 plt.show()

运行代码,你将看到一副随机漫步图

 

15.3.5设置样式】

15.3.6点着色】

为了体现“漫步”这一动做,咱们经过颜色映射来看看漫步的过程

1 point_numbers = list(range(rw.num_points))
2 plt.scatter(rw.x_values, rw.y_values, s = 10, c = point_numbers, cmp = plt.cm.Blues)

point_numbers为一个包含04999的列表,其做用在参数c上,辅助cmp:首次绘制的点c值为1,最后一个绘制的点c值为4999。这样,首次绘制的点的颜色最浅,随着绘制点的增多,颜色越深,即可以大体观测“漫步”过程

 

15.3.7起点和终点】

经过颜色映射呈现了各个点的前后顺序,咱们还能够重点突出绘制的起点和终点

1 plt.scatter(rw.x_values, rw.y_values, s = 2, c = point_numbers, cmp = plt.cm.Blues)
2 plt.scatter(0, 0, s = 50, c = 'green')
3 plt.scatter(rw.x_values[-1], rw.y_values[-1], s = 50, c = 'red')

15.3.8增长点数】

经过增长绘制的点数,构造一副漂亮的画

 

15.3.9隐藏坐标轴】

1 plt.axes().get_xaxis().set_visible(False)
2 plt.axes().get_yaxis().set_visible(False)

plt.axes(arg = None , **kwargs)

使用函数plt.axes( )来将每条坐标轴的可见性都设置为False

△尝试对比plt.axis( )函数,你会发现plt.axis( )也有相似操做:plt.axis('off'),不一样的是,使用plt.axes( )会保留边框线,而plt.axis( )仅呈现绘制的点

详情自行查阅Matplotlib官网

【使用plt.axes( )为何会有警告:warnings.warn(message , mplDeprecation , stacklevel = 1??】

15.3.10调整窗口尺寸】

你会发现,绘制出来的图表始终是一样大小,不管里面的点数量多或少;当点多时,会显示密集,当点少时,会显示稀疏

当你拉动显示图表的窗口放大或缩小时,里面的图表也会相应做出改变

“图表适合窗口的大学时,更能有效地将数据中的规律呈现出来”,因而咱们添加代码:

1 plt.figure(figsize = (10, 6))

plt.figure(figure = None , ... , **kwargs)

书籍中,仅仅是指出,给figure( )函数的参数figsize传递一个元组,用以指定绘图窗口的尺寸,单位为英寸

可是它没有强调位置!

经反复试验,有如下状况:

plt.figure( )放在plt.scatter( )以前,成功指定绘图的窗口大小

plt.figure( )放在plt.scatter( )以后,但在plt.show( )以前,居然建立了两个窗口,一个是plt.figure( )建立的指定大小的窗口,但它是空白的;另外一个是默认窗口,scatter( )绘制的图表在其中,至关于没有使用plt.figure( )指定窗口大小,还无故多了个无用的空白窗口

个人理解是,scatter( )执行过程当中便已经在默认的窗口中完成了绘图,只需show( )便可;假若以后再经过figure( )指定窗口大小,这时只会额外建立一个符号指定的窗口

plt.figure( )放在plt.show( )以后,根本没用调用plt.figure( )代码行

△综上,建议在早期未调用相关函数以前就调用plt.figure( )

15.3.11调整分辨率】

DPI(Dots Per Inch)每英寸点数,分辨率的度量单位

DPI专业人士眼中通常只针对输出设备(如打印机)而言,而针对显示器的图像分辨率则用PPI(Pixels Per Inch)表示。但一般DPI便是指分辨率

pixel  /pɪksəl/  n.显示器的像素

Python假定屏幕分辨率为80像素/英寸,所以若指定大小的图表尺寸不合适,可以使用形参dpifigure( )传递本身系统的分辨率:

plt.figure(dpi = 96 , figsize = (10 , 6))

DPI的含义为每英寸像素点,当传递的形参dpi太小,会出现图表显示太小的状况:

 

【我怎么以为它更细致了??】

'''''''

相关文章
相关标签/搜索