前情提要
上篇介绍如何用Python绘制散点图,本篇将介绍随机漫步。
随机漫步
3.1 概述
随机漫步指在完全随机的情况下,进行没有明确方向,由一系列随机政策来干预的行走。
应用:在自然学,物理学,生物学,化学各领域中,随机漫步都有其实际用途。例如分子的无序运动。编写随机漫步代码将可模拟现实世界中的多种情形。
3.2 创建RandomWalk类
为模拟随机漫步,建议复习Python类有关知识和实际应用。
创建RandomWalk类,根据随机漫步的实际意义,这个类需要包含三个属性:一是记录随机漫步次数的变量,二、三则是两个列表,用于记录二维坐标(x,y)。该应用在折线图和散点图也有相应涉及。
接下来根据类的相关知识,进行随机漫步的属性设置。
from random import choice
#模拟随机漫步的类
class RandomWalk:
#设置随机漫步默认次数,初始坐标(0,0)(初始化属性)
def __init__(self,num_points=5000):
self.num_points=num_points
self.x_values=[0]
self.y_values=[0]
随机漫步次数设置为5000,大则能生成恰到好处的图形,小则能快速模拟随机漫步。由于随机漫步的坐标是多组有序数对,故用列表进行存储。
到此,随机漫步的初始状态已经设置完毕。
3.3 选择方向
设置完初始状态,即将开始模拟,此时模拟选择方向,使用方法fill_walk()来生成漫步包含的点并决定每次漫步的方向。
def fill_walk(self):
"""计算机随机漫步包含的所有点"""
#不断漫步,直到列表达到指定长度(5000)
while len(self.x_values)<self.num_points:
#决定前进方向及沿着这个方向前进的距离
x_direction=choice([1,-1])
x_distance=choice([0,1,2,3,4])
x_step=x_direction*x_distance
#y轴移动同理
y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
#计算x和y的值
x=self.x_values[-1]+x_step
y=self.y.values[-1]+y_step
#将值添加到列表末尾
self.x_values.append(x)
self.y_values.append(y)
二维随机漫步,以在x轴的移动为例,调动choice函数,选择正负两个方进行移动。
在设置随机移动长度的步骤上包含0,实现了单轴移动的可能。
计算x和y的值:用列表最后的一次结果加上本次移动的结果可得经过此次随机漫步的坐标,再将此次结果添加到列表末尾,形成while循环,直到完成5000次随机漫步。
此时随机漫步已完成,接下来需绘制打印该随机漫步图的效果。
3.4 绘制
利用上篇中提到的scatter函数,进行描点绘制。详情请参照上篇。
import matplotlib.pyplot as plt
rw=RandomWalk()
rw.fill_walk()
#绘制点
plt.style.use('ggplot')
fig,ax=plt.subplots()
ax.scatter(rw.x_values,rw.y_values,s=10)
plt.show()
即可得到随机漫步效果。
3.5 模拟多次随机漫步
有时我们需要让程序运行多次,此时
可使用循环。当程序还处于运行过程,就不断模拟随机漫步,直到我们对他说“不”。
while True:
keep_running=input("Again?")
if keep_running=="No.":
break
即可实现多次随机漫步。
3.6 设计样式
3.6.1 给点着色
为方便观察,我们使用颜色映射对先后出现的点进行区分先后顺序。
fig,ax=plt.subplots()
point_numbers=range(rw.num_points)
ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=10)
此处添加的两行代码,第一行引入range生成数字列表,标志了五千个点。在设置颜色映射的过程中,将c这个参数设置成随机漫步次数。
颜色映射具体可参考上篇。
运行如下。
3.6.2 突出起点与终点
为了让起点和终点更加突出,结合上篇,我们可以重新设置起点和终点的属性。例如,重新设置边框,颜色,点径大小。
ax.scatter(0,0,c='green',edgecolors='none',s=100)
ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)
3.6.3 隐藏坐标轴
隐藏图标坐标轴,可帮助我们更好观察随机漫步路径。
#隐藏坐标轴
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
此时运行如下。
结语
本篇讲述如何实现简单的随机漫步。随机漫步在四种基础可视化中难度较高,且需要熟练理解和掌握关于类的概念。有兴趣的朋友可以细致研究一下关于init方法和类。