Python matplotlib 利用随机函数生成变化图形


Posted in Python onApril 26, 2022

前言

综合前述的类、函数、matplotlib等,完成一个随机移动的过程(注意要确定移动的次数,比如10万次),每次行走都完全是随机的,没有明确的方向,结果是由一系列随机决策确定的,最后显示出每次移动的位置的图表。

思考:

1)每次走动多少个像素,由随机函数决定,每次移动方向也随机确定。由随机方向和随机像素共同移动位置大小和方向。

2)保证将每次移动的位置保存在列表中,供后面matplotlib调用,生成图表。

故而,可以分成两个文件,一个为rand_moving类,生成走动像素、方向,并记录相关数据,保存在数列中,另一个为绘图模块randdraw_visual ,调用matplotlib和rand_moving类,生成一个实例,并调用计算出的数列组生成图表。

一、rand_moving.py文件定义功能如下

1、初始化程序,设置一个参数,即移动的次数,初始化位置全部设置为0

2、随机生成x,y的方向和移动像素,并相乘,得到相对移动距离,即为每次移动的距离和方向,即需要4个随机函数来分别确定水平方向和垂直方向的 移动位置大小和方向,

3,计算出下一个位置,并进行保存到位置数列中,即每走完一步后,在屏幕中的绝对位置。

如下: 

from random import choice  #random是系统自带的随机函数模块

class Rand_moving(): #定义一个Rand_moving类
    def __init__(self,num_times=100000):  # 初始化,设置默认参数为10万,可以修改这个参数试试机器运行速度
        self.num_times = num_times  #移动次数
        
        self.x_values=[0]   # 设置两个数列,用来保存每一步的位置,初始位置为(0, 0),数列元素个数会一直增加到num_times,用来记录每一步的位置信息
        self.y_values=[0]    
        
    def fill_moving(self):  #定义一个函数,用来计算移动方向和距离,并计算需要保存的位置信息
        while len(self.x_values)<self.num_times:#循环不断运行,直到漫步包含所需数量的点num_times
           
            x_direction = choice([1,-1])       #x的移动方向,1向上,0不变,-1向下
            x_distance = choice([0,1,2,3,4,5]) #x的每次移动的像素,
            x_step = x_direction*x_distance    #移动方向乘以移动距离,以确定沿x移动的距离
            
            y_direction =  choice([1,-1])      #y的移动方向,1向上,0不变,-1向下
            y_distance = choice([0,1,2,3,4,5]) #y的每次移动的像素,
            y_step = y_direction*y_distance    #移动方向乘以移动距离,以确定沿y移动的距离
            
            #原地不变
            if x_step ==0 and y_step==0:  # x_step和 y_step都为零,则意味着原地踏步
                continue
            
            #计算下一个点的位置坐标x和y值,并分别保存到数列x_values和y_values中
            next_x = self.x_values[-1] + x_step  #self.x_values[-1]表示是数列最后一个值,初始为x_values=[0]
            next_y = self.y_values[-1] + y_step   
            
            self.x_values.append(next_x ) #将每次计算的next_x存入到数列x_values中
            self.y_values.append(next_y ) #将每次计算的next_y存入到数列y_values中

二、绘图模块

randdraw_visual.py

绘图模块randdraw_visual.py的功能如下:

1、调用matplotlib和rand_moving类;

2、rand_moving生成一个实例,并计算出的数列组生成图表;

3、用matplotlib中的方法生成图表

import matplotlib.pyplot as plt  #导入matplotlib模块

from rand_moving import *   #也可以用 import random_moving   注意使用过程中的细微差别 ,小写开头的rand_moving是文件(或称为模块,一个模块中可以有一个类,或多个类),大写开头Rand_moving是类。

rm = Rand_moving()  # 利用导入的 Rand_moving 类,创建一个实例rm,这里没有给定参数,默认是10万,可以修改为其他数据。
rm.fill_moving()    # 调用类的方法fill_moving() ,并生成随机数列,存入到x_values和y_values中,

plt.scatter(rm.x_values, rm.y_values,s=15)#调用实例rm中位置数列x_values和y_values生成图表
plt.show()

程序运行效果(注意,为了对比,程序中创建了3个实例,其中一个为默认值,另两个为50万和5万,如果一直没显示,请耐心等会儿!)

Python matplotlib 利用随机函数生成变化图形

上述三个实例处在同一图中,呈现不同颜色,如果只有一个实例,如何修改颜色?

入门(1)中,语句 plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues,edgecolor='none', s=40) 是修改渐变色的,可偿试将randdraw_visual.py模块中进行如下修改:

plt.scatter(rm.x_values, rm.y_values,c=y_values, cmap=plt.cm.Reds,edgecolor='none',s=15)

注: c的参数是字符串,可以直接使用颜色的英文进行赋值,比如:c='yellow',见后面修改起点、终点颜色。

指定一个红色,一个蓝色,实际运行效果(有重复的地方,实例设置为蓝色在后面,将红色盖住):

Python matplotlib 利用随机函数生成变化图形

除些之外,还可以对特定的点进行设定,也就是在语句plt.scatter(rm.x_values, rm.y_values,c=y_values, cmap=plt.cm.Reds,edgecolor='none',s=15)之后,再多几个相关语句,并给定相关点坐标。

import matplotlib.pyplot as plt

from rand_moving import *   #也可以用import random_moving注意使用过程中的差别

rm = Rand_moving()  # 创建一个实例rm,这里没有给定参数,默认是10万,可以修改为其他数据。
rm.fill_moving()    # 调用类的方法fill_moving() ,并生成随机数列,存入到x_values和y_values中
plt.scatter(rm.x_values,rm.y_values,c=rm.y_values,cmap=plt.cm.Reds,edgecolor='none',s=15)
#调用实例rm中数列x_values和y_values生成图表#调用实例rm中数列x_values和y_values生成图表

new_rm = Rand_moving(500000)  # 创建一个实例new_rm,是50万次
new_rm.fill_moving()   
plt.scatter(new_rm.x_values,new_rm.y_values,c=new_rm.y_values, cmap=plt.cm.Blues,edgecolor='none',s=15)

# 重绘起点,终点
#因为两个实例的起点一样,只需一个起点即可
plt.scatter(rm.x_values[0], rm.y_values[0],c='yellow',edgecolor='none',s=100)   #设置起点,把s设置较大,以示区别
#两个实例终点不同,分别重绘终点位置 
plt.scatter(rm.x_values[-1], rm.y_values[-1],c='brown',edgecolor='none',s=100)  #设置实例rm的终点,思考为什么用[-1]
plt.scatter(new_rm.x_values[-1], new_rm.y_values[-1],c='pink',edgecolor='none',s=100) #设置实例new_rm的终点

plt.show()

实际运行效果:

Python matplotlib 利用随机函数生成变化图形

显示图表屏幕大小

图表适合屏幕大小能有效地将数据中的规律呈现出来,如果要调整屏幕大小,可调整matplotlib输出的尺寸

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

函数 figure() 用于指定图表的宽度、高度、分辨率和背景色。

形参 figsize 指定一个元组

形参 dpi 向 figure() 传递该分辨率

注意:plt.figure(dpi=128,figsize=(12, 10))语句要在其他plt开始语句的前面,才能调整显示屏幕的大小。

import matplotlib.pyplot as plt

from rand_moving import *   #也可以用import random_moving注意使用过程中的差别
#调整屏幕大小
plt.figure(dpi=128,figsize=(12, 10))  #一开始就要定义显示的大小,当然,可以试一下,放到plt.show()之前其他位置的运行效果。

rm = Rand_moving()  # 创建一个实例rm,这里没有给定参数,默认是10万,可以修改为其他数据。
rm.fill_moving()    # 调用类的方法fill_moving() ,并生成随机数列,存入到x_values和y_values中
plt.scatter(rm.x_values,rm.y_values,c=rm.y_values,cmap=plt.cm.Reds,edgecolor='none',s=15)
#调用实例rm中数列x_values和y_values生成图表#调用实例rm中数列x_values和y_values生成图表

new_rm = Rand_moving(500000)  # 创建一个实例new_rm,是50万次
new_rm.fill_moving()   
plt.scatter(new_rm.x_values,new_rm.y_values,c=new_rm.y_values, cmap=plt.cm.Blues,edgecolor='none',s=15)

plt.show()

当然,还可以试一下他函数功能。 

是不是有点小小的成就感!

小结

请思考:

1、上述程序是否能进行优化(比如功能相同的)

2、创建三个3个实例,用了3个语句,能否建一个函数,只输入一个数n,就自动创建n个实例?同时,每个实例的num_times随机,(n比较大时,num_times应该比较小)

3、当实现上述功能后,程序运行,只输入一个参数(创建实例的个数),就会自动生成对应的num_times,并分别调用相关函数生成对应图表。

以上就是Python利用随机函数生成变化图形的详细内容!


Tags in this post...

Python 相关文章推荐
python中正则的使用指南
Dec 04 Python
python中安装模块包版本冲突问题的解决
May 02 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
如何解决安装python3.6.1失败
Jul 01 Python
Python 实现RSA加解密文本文件
Dec 30 Python
Python 内存管理机制全面分析
Jan 16 Python
Pytorch可视化的几种实现方法
Jun 10 Python
方法汇总:Python 安装第三方库常用
Apr 26 #Python
Python 统计序列中元素的出现频度
Apr 26 #Python
Python matplotlib安装以及实现简单曲线的绘制
Python爬虫 简单介绍一下Xpath及使用
分享python函数常见关键字
Apr 26 #Python
python和Appium的移动端多设备自动化测试框架
Apr 26 #Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
You might like
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
JavaScript的Function详细
2006/11/14 Javascript
新手入门常用代码集锦
2007/01/11 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
React快速入门教程
2017/01/17 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
Python实现的多线程端口扫描工具分享
2015/01/21 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
pycharm显示远程图片的实现
2019/11/04 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Python对象的属性访问过程详解
2020/03/05 Python
惠普香港官方商店:HP香港
2019/04/30 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
班干部演讲稿
2014/04/24 职场文书
运动会的口号
2014/06/09 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2014年设计师工作总结
2014/11/25 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript