关于 《python 从入门到实践》的 matplotlib 随机漫步小项目

news2024/12/24 3:15:22

使用 python 生成随机漫步数据,再使用 matplotlib 将数据呈现。

所谓随机漫步:

每次行走的路径都是完全随机的,就像蚂蚁在晕头转向的情况下,每次都沿随机方向前行路径。
在自然界,物理学,生物学,化学和经济领域,随机漫步都有很多实际用途。
例如:漂浮在水滴上的花粉因不断受到水分子的挤压而在水面上移动。水滴中的分子运动是随机的,因此花粉在水面上的运动路径犹如随机漫步。

现在我们来自己编写模仿现实世界中的情形:

文章目录

          • 创建 RandomWalk() 类
          • 选择方向
          • 绘制随机漫步图
          • 模拟多次随机漫步
        • 设置随机漫步的样式
          • 给点着色
          • 重新绘制起点和终点
          • 隐藏坐标轴
          • 增加点数
          • 调整尺寸

创建 RandomWalk() 类

该类用于:

随机选择前进方向。它需要三个属性,其中一个是存储随机漫步次数的变量,其他两个是列表,分别存储随机漫步经过的每个点的 x 和 y 坐标。

random_walk.py

from random import choice

class RandomWalk():
    #一个生成随机漫步数据的类
    def __init__(self,num_points =5000):
        self.num_points = num_points
        
        #所有随机漫步都始于
        self.x_values = [0]
        self.y_values = [0]

为保证随机漫步可以做出随机决策,我们将所有的选择都存储在一个列表中,并在每次做决策时都使用 choice() 来做出使用哪种选择。
随机漫步包含的默认点数设置为 5000。既可以生成有趣的模式,同时又足够小。可确保快速模拟出随机漫步。

选择方向

下面我们继续在这个类中添加一个方法。
用于:

生成漫步时包含的点,并决定每次漫步的方向。

    def fill_walk(self):
        #计算漫步时包含的所有点
        #通过循环,不断漫步,知道列表到达指定的长度
        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_direction = choice([1,-1])
            y_distance = choice([0,1,2,3,4])
            y_step = y_direction * y_distance
            
            #拒绝原地踏步
            if x_step == 0 and y_step == 0:
                continue
            #计算下一个点的x和y值
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step
            self.x_values.append(next_x)
            self.y_values.append(next_y)

使用choice([1,-1]) 给 x_direction 选择一个值,结果要么是表示向右走的 1 ,要么是表示向左走的-1。接下来,choice([0,1,2,3,4]) 随机地选择一个 0~4 之间的整数,告诉 python 沿指定的方向走多远(x_distance) 通过包含0,我们不仅能够沿两个轴移动,还能够沿 y 轴移动。
.
将移动方向乘以距离,以确定沿x和y轴移动的距离。如果x_step为正,将向右移动,为负将向左移动,而为零意味着水平移动;如果y_step为正,就意味着向上移动,为负意味着向下移动,而为零意味着水平移动。如果x_step 和 y_step 都为零,则意味着原地踏步,我们拒绝这样的情况,接着执行下一次循环。

绘制随机漫步图

下面的代码将随机漫步的所有点都绘制起来。

rw_visual.py

import matplotlib.pyplot as plt
from random_walk import RandomWalk
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=15)
plt.show()

运行一下程序 查看效果:
在这里插入图片描述

报错说没有这个参数,我找了很久问题。
最后无奈,只能从 csdn查了一下,即便自己知道是哪的问题也没成功解决。。

看来还是功力尚浅啊!
这是因为 pychram 自动录入的 init方法 是缩写的。。。

有意思吗…

在看一下运行效果:
在这里插入图片描述

模拟多次随机漫步

现在每次启动程序运行的结果都不相同。

还真是随机漫步!不过要想只运行一次程序就有多次随机漫步的效果的话,我们可以加入 while 循环。

rw_visual.py

import matplotlib.pyplot as plt
from random_walk import RandomWalk

#在程序处于活动状态,就不断地模拟随机漫步
while True:
    rw = RandomWalk()
    rw.fill_walk()
    plt.scatter(rw.x_values,rw.y_values,s=15)
    plt.show()

    keep_ruuning = input("你要要继续运行随机漫步吗? (y/n):")
    if keep_ruuning == 'n':
         break

现在随机漫步终于可以在不关闭的情况下继续漫步了。
在这里插入图片描述

设置随机漫步的样式

现在为了可以让我们可通过视觉观察出随机漫步的路程,突出漫步的起点,终点和经过的路径。

给点着色

使用颜色映射指出漫步中各点颜色、删除每个点的黑色轮廓,使其颜色更明显。

传递参数 c,将其设置为列表,其中包含各点先后顺序。(因为各点是按照顺序绘制,所以参数c指定的列表只包含数字 1~5000):

rw_visual.py

import matplotlib.pyplot as plt
from random_walk import RandomWalk

#在程序处于活动状态,就不断地模拟随机漫步
while True:
    rw = RandomWalk()
    rw.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)
    plt.show()

    keep_ruuning = input("你要要继续运行随机漫步吗? (y/n):")
    if keep_ruuning == 'n':
         break

这里,我们使用 range 生成一个数字列表,其中包含的数字个数与漫步包含的点数相同。接下来,将这个列表存储在point_numbers 中,以便后面使用它来设置每个漫步点的颜色。

在这里插入图片描述

重新绘制起点和终点

除了上述给随机漫步各个点着色(便于指出先后顺序),还可以呈现随机漫步的起点和终点,编码如下:

    point_numbers = list(range(rw.num_points))
    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.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,
                edgecolors='none',s=15)
    plt.show()
隐藏坐标轴
while True:
    rw = RandomWalk()
    rw.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)
    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)
    current_axes = plt.axes()
    current_axes.xaxis.set_visible(False)
    current_axes.yaxis.set_visible(False)

    plt.show()

    keep_ruuning = input("你要要继续运行随机漫步吗? (y/n):")
    if keep_ruuning == 'n':
         break
增加点数

增加点数,以提供更多的数据:

import matplotlib.pyplot as plt
from random_walk import RandomWalk

#在程序处于活动状态,就不断地模拟随机漫步
while True:
    rw = RandomWalk(50000)
    rw.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=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.xticks([])
    plt.yticks([])

    plt.show()

    keep_ruuning = input("你要要继续运行随机漫步吗? (y/n):")
    if keep_ruuning == 'n':
         break

在这里插入图片描述

调整尺寸
import matplotlib.pyplot as plt
from random_walk import RandomWalk

#在程序处于活动状态,就不断地模拟随机漫步
while True:
    rw = RandomWalk(50000)
    rw.fill_walk()

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

    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.xticks([])
    plt.yticks([])

    plt.show()

    keep_ruuning = input("你要要继续运行随机漫步吗? (y/n):")
    if keep_ruuning == 'n':
         break

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Job for network.service failed(网卡启动报错)

上图是Linux网卡启动报错的情况 这是由于cat/etc/sysconfig/network-scripts/ifcfg-xxx 中HWADDR的MAC地址和ifconfig中的MAC地址不一样&#xff0c;或者缺少cat/etc/sysconfig/network-scripts/ifcfg-xxx 中HWADDR的MAC地址 1.查看ifconfig中的MAC地址 图中00&#xff1a;0c…

【新星计划-2023】IP地址是什么?IP地址的主要功能是什么?

IP地址在生活中是很常见的&#xff0c;我们所使用的手机、电脑等等&#xff0c;都有一个IP地址&#xff0c;那么IP地址是什么&#xff1f;通过IP地址又能干什么&#xff1f;下文就来给大家详细的讲解一下。 一、什么是IP地址 通常我们说的IP地址多数是指互联网中联网的IP地址…

Java 基础进阶篇(十一)—— Arrays 与 Collections 工具类

文章目录 一、Arrays工具类1.1 Arrays 类常用方法1.2 对于 Comparator 比较器的支持1.3 Arrays 的综合应用1.3.1 应用一&#xff1a;数组的降序排序1.3.2 应用二&#xff1a;根据学生年龄进行排序 二、Collections工具类2.1 Collections 类常用方法2.2 Collections 排序相关 AP…

神经网络实验---梯度下降法

本次实验主要目的是掌握梯度下降法的基本原理&#xff0c;能够使用梯度下降法求解一元和多元线性回归问题。 文章目录 目录 文章目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 实验小结&讨论题 1. 实验目的 ① 掌握…

〖Python网络爬虫实战㉓〗- Ajax数据爬取之什么是Ajax

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

23.5.7总结(学习通项目思路)

项目思路&#xff1a; 注册&#xff1a;输入邮箱&#xff08;判重&#xff09;&#xff0c;两次输入密码&#xff0c;获得的正确的验证码&#xff0c;获得不重复的用户名。 登录&#xff1a;输入用户名和密码登录。 忘记密码&#xff1a;输入邮箱&#xff08;和用户名&#…

RK3588平台开发系列讲解(进程篇)可执行文件内部结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 ELF 文件的两大组成部分二、文件头三、程序头和节区头四、ELF 文件的细节结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在 Linux 中,二进制可执行文件的标准格式叫做 ELF(Executable and Linkabl…

ARP协议结构

文章目录 概念ARP协议格式ARP协议的作用ARP协议的工作流程 首先提出一个问题&#xff0c;来理解ARP解决什么问题 已知报文在数据链路层传输的过程中&#xff08;假设是主机A到主机B&#xff09;&#xff0c;是通过路由器之间的跳转&#xff0c;根据路由表&#xff0c;结合目的…

【论文】SimCLS:一个简单的框架 摘要总结的对比学习(1)

SimCLS:摘要总结的对比学习(1&#xff09; 写在最前面模型框架 摘要1 简介 写在最前面 SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization&#xff08;2021ACL会议&#xff09; https://arxiv.org/abs/2106.01890 论文&#xff1a;https://…

【c语言小demo】登录demo | 账号密码验证功能

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

postgresql insert ddl执行流程分析

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 总体流程 调用堆栈 执行接口说明 详细流程分解 ExecInsert对于普通表…

Java9

Java9 &#xff08;一&#xff09;、stream流1.1 Stream流的中间方法和终结方法 &#xff08;二&#xff09;、方法引用2.1 方法引用的分类 &#xff08;三&#xff09;、异常3.1 编译时异常和运行时异常3.2 异常的作用3.3 异常的处理方式3.4 异常中的常见方法3.5 自定义异常 &…

麒麟设置分辨率

为什么要设置------额。。。。虚拟机启动的&#xff0c;直接满屏了。。。。也不能移动 命令设置法 1、可以通过xrandr命令来设置屏幕分辨率。先查询当前分辨率&#xff0c;及当前支持的分辨率。 xrandr 2、可以通过-s参数来设置为1920x1440 xrandr -s 1920x1440 这就好…

Midjouney prompt优化

Midjouney prompt优化 总述1. Midjouney1.1 常见出图方式1.2 图片参数 2. prompt2.1 prompt关键词框架逻辑2.2 关键词技巧2.3 分类关键词2.3.1 媒体类型、介质和渲染引擎2.3.2 艺术风格2.3.2.1常见风格关键词2.3.2.2 艺术风格介绍2.3.2.3 绘画风格关键词和作品 2.3.3 相机镜头和…

面试官从这些方面考察你的Android开发水平!

View基础(25题) 什么是ViewView的位置参数MotionEventViewRootDecorViewMeasureSpec View三大流程(28题) measure过程ViewViewGrouplayout过程draw过程获取View的宽高Activity启动到加载ViewRoot的流程 自定义View(26题) 四种实现方法直接继承View自定义属性直接继承ViewG…

C++三大特性—继承“复杂的菱形继承及菱形虚拟继承”

C的一个大坑&#xff1a;菱形继承 希望这篇文章能让你理解什么是菱形继承&#xff0c;以及菱形继承的注意事项 单继承与多继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承…

【半监督学习】Match系列.2

本文简单介绍半监督算法中的Match系列方法&#xff1a;CoMatch&#xff08;ICCV2021&#xff09;&#xff0c;CRMatch&#xff08;GCPR2021&#xff09;&#xff0c;Dash&#xff08;ICML2021&#xff09;&#xff0c;UPS&#xff08;ICLR2021&#xff09;&#xff0c;SimMatch…

ajax、fetch、axios三者的异同

同&#xff1a;都是发送网络请求 异&#xff1a; 1.ajax ajax是异步的javascript和xml&#xff0c;用于创建快速的动态网页的技术。&#xff08;用js发送异步的网络请求&#xff09; 特点&#xff1a;局部刷新页面&#xff0c;无需重载整个页面。 很多小伙伴会误以为ajax是…

2023年的深度学习入门指南(12) - PEFT与LoRA

2023年的深度学习入门指南(12) - PEFT与LoRA 大家都知道&#xff0c;大模型的训练需要海量的算力。其实&#xff0c;即使是只对大模型做微调训练&#xff0c;也是需要大量的计算资源的。 有没有用更少的计算资源来进行微调的方法呢&#xff1f;研究者研发出了几种被Hugging F…

fastCGI使用

1.http解释 在使用fastCGI之前需要先了解什么是http&#xff0c;以及静态请求和动态请求。 1.什么是http HTTP是超文本传输协议&#xff0c;它定义了客户端和服务器端之间文本传输的规范。HTTP通常运行在TCP之上&#xff0c;使用80端口。HTTP是一种简单的请求-响应协议&#x…