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之折腾一下目录
Oct 24 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
Python常用的爬虫技巧总结
Mar 28 Python
python学习之hook钩子的原理和使用
Oct 25 Python
selenium处理元素定位点击无效问题
Jun 12 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
sklearn+python:线性回归案例
Feb 24 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
python不同版本的_new_不同点总结
Dec 09 Python
python中str内置函数用法总结
Dec 27 Python
Python实现位图分割的效果
Nov 20 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
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
jquery easyui使用心得
2014/07/07 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
简述vue中的config配置
2018/01/23 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
基于python实现学生管理系统
2018/10/17 Python
Python3 log10()函数简单用法
2019/02/19 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
简历的自荐信
2013/12/19 职场文书
创意活动策划书
2014/01/15 职场文书
毕业生面试求职信
2014/06/23 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
Python序列化与反序列化相关知识总结
2021/06/08 Python
Python实战之OpenCV实现猫脸检测
2021/06/26 Python