Matplotlib 数据可视化(二)
Matplotlib 数据可视化(二)
引入
这一篇做的其实是上一篇的练习。
想象有一个小人,每一回合随机移动一次,我们想记录下小人每次移动后的位置,并用 matplotlib 以散点图的形式绘制出来。
下面我们做的就是模拟这个过程。
生成数据
要生成随机数据,先导入一个函数:
1 |
|
这里附上一段简单的介绍:
random
模块有大量的函数用来产生随机数和随机选择元素。 比如,要想从一个序列中随机的抽取一个元素,可以使用random.choice()
1
2
3
4
5
6
>>> import random
>>> values = [1, 2, 3, 4, 5, 6]
>>> random.choice(values)
2
>>> random.choice(values)
3
当然这里我们只导入了 choice
函数,直接使用就好了。
这里先写一个 RandomWalk
类
random_walk.py
1 |
|
这个类接收一个参数 num_points
表示漫步/随机生成数据的数量。我们把它的默认值定为 5000。
然后先来看这个 fill_walk()
函数。
fill_walk()
函数
首先这个循环很容易理解,只要 x_values
的长度没有到达预定的数量就一直生成数据,于是我们可以获得指定数量的随机数据。
生成的数据包含两个数字,x_step
和 y_step
,即漫步的纵横方向。先从 ±1 中随机挑选一个,指定了移动的方向是正方向还是负方向,然后再从 distance
中随机选一个数,指定了移动距离。两个数字相乘就是移动的量。
但是有一种可能是,x 和 y 同时选中了 0,我们不想让它原地踏步,所以如果出现这种情况,就不写入数据,而是再随机一轮。
但在这里我们要画出的并不是位置的变化量,而是位置本身,所以我们要计算出,这次移动之后,我们漫步到了什么位置。next_x
和 next_y
的值就是上一次 x 和 y 的位置,加上变化量。
看到这里,x_values
和 y_values
的功能也就明了了,他们记录的是小人每次移动后的位置。
然后我们把这个移动的量分别存入 x_values
和 y_values
中,两个相同位置的 x 和 y 值一一对应,就是小人每次移动后的位置。
因为我们想让小人从原点出发,所以这里我们初始化 x_values
和 y_values
中的第一个值为 0。
绘制图像
基础图像
首先导入需要的模块。rw_visual.py
1 |
|
rw_visual.py
1 |
|
首先创建一个 RandomWalk
类的实例,并运行 fill_walk()
函数来生成数据。
然后绘制散点图,x 和 y 的数据即 RandomWalk
中的 x_values
和 y_values
。
进阶图像
既然是随机漫步,我们就想知道开始的位置和结束的位置,以及行走的方向。
rw_visual.py
1 |
|
plt.figure(figsize=(10, 6))
设置了绘图窗口的尺寸,figure()
是用来指定图表的一些参数的,例如尺寸、分辨率、颜色,这里我们制定尺寸,所以需要给形参 figsize
一个元组,规定绘图窗口的尺寸,单位是英寸。
这里 Python 默认你的屏幕分辨率是 80 PPI(像素/英寸),如果想设定的话,可以使用形参 dpi
,如 plt.figure(dpi=128, figsize(10, 6))
。[1]
然后我们想按照漫步的顺序来给点上色,先走到的点颜色浅,后走到的点颜色深,于是我们创建一个列表,内容是 [1,2,3,..., rw.numpoints]
,这个列表的长度刚好与漫步的次数相同。
此外,我们还想突出起点和终点,于是使用了额外的两行,重新定义了起点和终点的属性。起点就是 (rw.x_values[0], rw.y_values[0])
点,也就是 (0, 0)
点,我们用绿色标出;终点就是最后一组数据,即 (rw.x_values[-1], rw.y_values[-1])
点,用红色标出。
除此之外还可以隐藏坐标轴:rw_visual.py
1 |
|
但是我这里会报两个 Warning:
1 |
|
意思似乎是,现在这个版本可以这样写,但以后可能会有问题,如果你不打算更新版本的话也没问题。
- 这个 DPI 的概念感觉不是很清楚,在这里应该就认为屏幕上的 Dots per inch 就是 Pixels per inch 了。 ↩