Python随机漫步,使用matplotlib方式将这些数据呈现

我们将使用Python的随机漫步数据,再使用matplotlib方式将这些数据呈现出来!

随机漫步:每次行走都完全是随机的,没有明确的方向结果是由一系列随机决策决定的。

1、创建RandomWalk()类

创建RandomWalk()类,它随机的选择前进的方向。(需要三个属性)

  1. 存储随机漫步次数的变量
  2. 存储随机漫步经过的每个点的x坐标
  3. 存储随机漫步经过的每个点的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

不足之处,请指出,蟹蟹!!!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值