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使用xlrd模块读写Excel文件的方法
May 06 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
python getopt详解及简单实例
Dec 30 Python
python 实现敏感词过滤的方法
Jan 21 Python
使用Python制作简单的小程序IP查看器功能
Apr 16 Python
Python Pandas数据中对时间的操作
Jul 30 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
Python 内存管理机制全面分析
Jan 16 Python
Python pandas之求和运算和非空值个数统计
Aug 07 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
推荐几个开源的微信开发项目
2014/12/28 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python函数式编程实例详解
2020/01/17 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
房展策划方案
2014/06/07 职场文书
开场白怎么写
2015/06/01 职场文书
中秋晚会致辞
2015/07/31 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
Redis分布式锁的7种实现
2022/04/01 Redis