Python随机漫步,使用matplotlib方式将这些数据呈现
我们将使用Python的随机漫步数据,再使用matplotlib方式将这些数据呈现出来!
随机漫步:每次行走都完全是随机的,没有明确的方向结果是由一系列随机决策决定的。
1、创建RandomWalk()类
创建RandomWalk()类,它随机的选择前进的方向。(需要三个属性)
- 存储随机漫步次数的变量
- 存储随机漫步经过的每个点的x坐标
- 存储随机漫步经过的每个点的y坐标
RandomWalk类包含两个方法:
_init_()
fill_walk() 计算随机漫步所经过的所有点
首先新建一个random_walk.py文件
from random import choice
class RandomWalk():
"""一个生成随机漫步数据的类"""
def __init__(self,num_points=5000): #默认点数设置为5000
"""初始化随机漫步的属性"""
self.num_points=num_points
#所有随机漫步都始于(0,0)
self.x_values=[0] #存储随机漫步经过的每个点的x坐标
self.y_values=[0] #存储随机漫步经过的每个点的y坐标
2、选择方向
使用fill_walk()来生成漫步包含的点,并决定每次漫步的方向,将这个方法添加到random_walk.py文件中
def fill_walk(self):
"""计算随机漫步包含的所有的点"""
#不断漫步,直到列表达到指定的的长度
while len(self.x_values) < self.num_points:
"""决定前进方向以及沿这个方向前进的距离"""
x_direction=choice([1,-1]) #表示要么向右走1,要么表示向左走1
x_distance=choice([0,1,2,3,4]) #随机选择一个0~4之间的数,告诉Python沿着方向走多远
x_step=x_direction*x_distance #移动方向乘以移动距离
"""x_step如果为正,将向右移动;如果为负,将向左移动,为零即垂直移动"""
y_direction = choice([1, -1]) # 表示要么向右走1,要么表示向左走1
y_distance = choice([0, 1, 2, 3, 4]) # 随机选择一个0~4之间的数,告诉Python沿着方向走多远
y_step = y_direction * y_distance # 移动方向乘以移动距离
"""y_step如果为正,将向上移动;如果为负,将向下移动,为零即水平移动"""
#拒绝原地踏步(即x_step和y_step都为0)
if x_step==0 and y_step==0:
continue
#计算下一个点的x和y的值
next_x=self.x_values[-1]+x_step #为了漫步下一个点的x的值,将x_step与x_values中的最后一个值相加
next_y=self.y_values[-1]+y_step #为了漫步下一个点的y的值,将y_step与y_values中的最后一个值相加
self.x_values.append(next_x) #获得下一个点的x值后附加的x_values末尾
self.y_values.append(next_y) #获得下一个点的y值后附加的y_values末尾
到这一步,已经完成RandomWalk()中两个方法,下一步我们看下随机漫步的效果
3、绘制随机漫步图
新建一个rw_visual.py文件
import matplotlib.pyplot as plt #导入pyplot模块
from random_walk import RandomWalk #导入RandomWalk类
#创建一个RandomWalk实例,存储在rw中
rw=RandomWalk()
rw.fill_walk() #在调用fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=15)
#讲随机漫步包含的x和y传递给scatter(),选择点的尺寸为15
plt.show()
此处直接在rw_visual文件中运行即可,运行结果如下:
每次运行结果都是随机生成的会不一样!!!
4、可以模拟多次随机漫步
不需要自己手动不停地运行,这里我们可以将代码放在while循环中,代码如下所示:
在rw_visual.py文件文件中修改
import matplotlib.pyplot as plt #导入pyplot模块
from random_walk import RandomWalk #导入RandomWalk类
while True:
#创建一个RandomWalk实例,存储在rw中
rw=RandomWalk()
rw.fill_walk() #在调用fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=15)
#讲随机漫步包含的x和y传递给scatter(),选择点的尺寸为15
plt.show()
keep_running=input("是否要在模拟一次随机漫步(请输入是或否):")
if keep_running=='否':
break
通过while循环,问我们是否要再模拟一次,是:继续随机漫步,否:终止
效果图如下:
这时候你会发现随机生成了三张图,运行程序一张,循环两张,然后输入否终止程序!!!
5、可以给随机漫步设置样式
5.1、给点着色
用颜色映射来指出漫步中各点的先后顺序,并删除每个点的黑色轮廓,让颜色更明显。
传递参数c,并将其设置为一个列表,其中包含各点的先后顺序由于这些点是按照顺序绘制的,因此给参数c指定的列表只需包含数字1~5000。
在rw_visual.py文件文件中修改
import matplotlib.pyplot as plt #导入pyplot模块
from random_walk import RandomWalk #导入RandomWalk类
while True:
#创建一个RandomWalk实例,存储在rw中
rw=RandomWalk()
rw.fill_walk() #在调用fill_walk()
point_numbers=list(range(rw.num_points))
plt.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,
edgecolors='none',s=15)
#讲随机漫步包含的x和y传递给scatter(),选择点的尺寸为15
plt.show()
keep_running=input("是否要在模拟一次随机漫步(请输入是或否):")
if keep_running=='否':
break
plt.scatter(rw.x_values,rw.y_values,
c=point_numbers,
cmap=plt.cm.Blues,
edgecolors=‘none’,s=15)
c=point_numbers
将参数c设置为point_numbers即催记生成的1~5000个数
cmap=plt.cm.Blues
指定使用映射颜色为蓝色
edgecolors=‘none’
删除每个点周围的轮廓
效果图如下:
5.2、重新绘制起点和终点
加以改进呈现随机漫步的起点和终点
在rw_visual.py文件文件中添加
#突出起点和终点
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)
效果如下(绿色为起点,红色为终点):
5.3、隐藏坐标轴
为了突显随机漫步路径,以免注意的是坐标轴,可以对坐标轴进行隐藏
在rw_visual.py文件文件中添加
#隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
为了修改坐标轴使用了函数plt.axes()将每条坐标轴可见性都设置为False
效果图如下:
5.4、增加点数
我们在创建RandomWalk实例的时候增大num_points的值,并在绘图是调整每个点的大小
下面附上一份整份的rw_visual.py文件
import matplotlib.pyplot as plt #导入pyplot模块
from random_walk import RandomWalk #导入RandomWalk类
while True:
#创建一个RandomWalk实例,存储在rw中
rw=RandomWalk(50000)
rw.fill_walk() #在调用fill_walk()
#plt.scatter(rw.x_values,rw.y_values,s=15)
#讲随机漫步包含的x和y传递给scatter(),选择点的尺寸为15
point_numbers=list(range(rw.num_points))
plt.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,
edgecolors='none',s=1)
#突出起点和终点
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)
#隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
keep_running=input("是否要在模拟一次随机漫步(请输入是或否):")
if keep_running=='否':
break
这里修改了:
rw=RandomWalk(50000)
事例模拟了包含50000个点的随机
plt.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,
edgecolors=‘none’,s=1)
这里为了便于查看的更清晰,将点的大小修改为1
效果图如下:
6、调整尺寸以适应屏幕
为了便于有效的呈现,让绘图窗口更适合屏幕大小,可像matplotlib调整尺寸大小
在rw_visual.py文件中添加
#设置绘图窗口的尺寸
plt.figure(figsize=(10,6))
函数figure()用于指定图标的宽度、高度、分辨率和背景色,你需要给形参figsize指定一个元组,向matplotlib指出绘图窗口的尺寸
效果图如下:
综上随机漫步完毕!!!
附上完整的random_work.py和rw_visual.py文件
random_work.py
from random import choice
class RandomWalk():
"""一个生成随机漫步数据的类"""
def __init__(self,num_points=5000):
"""初始化随机漫步的属性"""
self.num_points=num_points
#所有随机漫步都始于(0,0)
self.x_values=[0]
self.y_values=[0]
def fill_walk(self):
"""计算随机漫步包含的所有的点"""
#不断漫步,直到列表达到指定的的长度
while len(self.x_values) < self.num_points:
"""决定前进方向以及沿这个方向前进的距离"""
x_direction=choice([1,-1]) #表示要么向右走1,要么表示向左走1
x_distance=choice([0,1,2,3,4]) #随机选择一个0~4之间的数,告诉Python沿着方向走多远
x_step=x_direction*x_distance #移动方向乘以移动距离
"""x_step如果为正,将向右移动;如果为负,将向左移动,为零即垂直移动"""
y_direction = choice([1, -1]) # 表示要么向右走1,要么表示向左走1
y_distance = choice([0, 1, 2, 3, 4]) # 随机选择一个0~4之间的数,告诉Python沿着方向走多远
y_step = y_direction * y_distance # 移动方向乘以移动距离
"""y_step如果为正,将向上移动;如果为负,将向下移动,为零即水平移动"""
#拒绝原地踏步(即x_step和y_step都为0)
if x_step==0 and y_step==0:
continue
#计算下一个点的x和y的值
next_x=self.x_values[-1]+x_step #为了漫步下一个点的x的值,将x_step与x_values中的最后一个值相加
next_y=self.y_values[-1]+y_step #为了漫步下一个点的y的值,将y_step与y_values中的最后一个值相加
self.x_values.append(next_x) #获得下一个点的x值后附加的x_values末尾
self.y_values.append(next_y) #获得下一个点的y值后附加的y_values末尾
rw_visual.py
import matplotlib.pyplot as plt #导入pyplot模块
from random_walk import RandomWalk #导入RandomWalk类
while True:
#创建一个RandomWalk实例,存储在rw中
rw=RandomWalk(50000)
rw.fill_walk() #在调用fill_walk()
#设置绘图窗口的尺寸
plt.figure(figsize=(10,6))
#plt.scatter(rw.x_values,rw.y_values,s=15)
#讲随机漫步包含的x和y传递给scatter(),选择点的尺寸为15
point_numbers=list(range(rw.num_points))
plt.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,
edgecolors='none',s=1)
#突出起点和终点
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)
#隐藏坐标轴
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
keep_running=input("是否要在模拟一次随机漫步(请输入是或否):")
if keep_running=='否':
break
还没有评论,来说两句吧...