Python利用随机函数生成变化图形详解
作者:PursuitingPeak 发布时间:2021-07-02 06:54:54
鉴于上一篇中最后三个问题:
1、上述程序是否能进行优化(比如功能相同的)
2、创建三个3个实例,用了3个语句,能否建一个函数,只输入一个数n,就自动创建n个实例?同时,每个实例的num_times随机,(n比较大时,num_times应该比较小)
3、当实现上述功能后,程序运行,只输入一个参数(创建实例的个数),就会自动生成对应的num_times,并分别调用相关函数生成对应图表。
可以,在类Rand_moving()中计算每一步的方向和移动位置时,都用到了一个乘法公式,
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移动的距离
因此可以整理出一个计算方法,可以直接调用,至于2,3很明显,也是可以完成的。
第一步,将乘法公式提出来单独形成一个作用于自身的方法,代码如下:
def get_step(self,direction,distance):
return distance*direction
def fill_moving(self):
while len(self.x_values)<self.num_times:#循环不断运行,直到漫步包含所需数量的点num_times
x_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5])) #直接调用get_step方法,使代码更加简洁
y_step = self.get_step(choice([1,-1]),choice([0,1,2,3,4,5]))
完成第1问,代码变得更加简洁明了。
第2、3个问题:
1)要能生成实例个数n,且还有对应的移动次数num_times,可考虑用字典,即实例个数为key,对应移动次数num_times为键值,当输入2时,如 caselist={’1‘:'150000',’2‘:'250000'}
2)读取字典每个项目,将对应的key和value传递给由Rand_moving类创建的实例,key的个数即为需要创建实例的个数,对应的value值为移动次数。
3)输入数字,即为字典key的个数,存入字典,同时利用随机函数生成一个num_times保存到对应的value中。
完成思路:
1,重新定义一个类 New_case() 作用:接收一个数据,并根据这个数据自动生成一个字典,
class New_case():
#定义New_case类
def __init__(self,numbers): #定义要创建的实例个数
self.numbers=numbers
self.caselist={} #定义一个空的caselist字典
self.case = 0
while self.case < self.numbers: #当变量case小于给定值时,
self.case += 1
times = choice([100000,150000,200000,250000])#随机选择一个移动次数
self.caselist[self.case] = times #将value与key对应
2、需要循环读取字典的key和value,并将value传递给类Rand_moving,随后再运行fill_moving()生成数据并保存到列表,随即用plt.scatter()进行绘图
for key,value in self.caselist.items(): #字典不为空
colorkey=str(key) # 将字典关键字转为字符串存到变量colorkey中
examplecase = Rand_moving(int(value)) #创建实例,将对应的value值传递类Rand_moving
examplecase.fill_moving() #调用类Rand_moving中的方法fill_moving()计算移动相关数据并保存到列表中
plt.figure(dpi=128,figsize=(12, 10)) #创建画面屏幕
plt.scatter(examplecase.x_values,examplecase.y_values,c=self.colors[colorkey],s=15)
plt.show()
上篇中的代码 c=y_values, cmap=plt.cm.Reds为什么这里不再用,是因为这里循环的时候一直出现红色Reds,为了对比,创建了一新字典colors{},将生成的个数与颜色相对应。所以上述代码中修改为 c=self.colors[colorkey]
类New_case() 全部代码如下:
import matplotlib.pyplot as plt
from rand_moving import *
class New_case():
#定义New_case类
def __init__(self,numbers): #定义要创建的实例个数
self.numbers=numbers
self.caselist={} #定义一个空的cases列表
self.case = 0 #定义一个case变量
self.colors={'1':'red','2':'orange','3':'yellow','4':'green','5':'blue','6':'puple'}#创建了一新字典colors{},将生成的个数与颜色相对应
while self.case < self.numbers: #小于给定实例个数时
self.case += 1
times = choice([100000,150000,200000,250000]) #随机生成一个移动次数
self.caselist[self.case] = times #将变量case作为key, times作为value保存到字典中
def case_moving(self): #重新定义一个方法,即访问字典所有项
for key,value in self.caselist.items(): #字典不为空
colorkey=str(key) # 将字典关键字转为字符串存到变量colorkey中
examplecase = Rand_moving(int(value)) #创建实例,将对应的value值传递类Rand_moving
examplecase.fill_moving() #调用类Rand_moving中的方法fill_moving()计算移动相关数据并保存到列表中
plt.figure(dpi=128,figsize=(12, 10)) #创建画面屏幕
plt.scatter(examplecase.x_values,examplecase.y_values,c=self.colors[colorkey],s=15)#注意调用了上述新字典的颜色
plt.show()
3、主程序
主程序中有一个交互,需要输入一个数据,然后调用相关相关类创建实例(慢慢成调包侠了!^v^)
import matplotlib.pyplot as plt
from rand_moving import *
from new_case import *
print("Please enter the number:") #交互,请输入一个数,模拟运行,不需要太大的数据。
n = input() #将输入的数据保存到变量n中,注意所有输入均为字符串,
testcase = New_case(int(n)) #将n转为整型数据,创建实例个数
testcase.case_moving()
实际运行效果,输入4,生成4个数据图形(为展示较全,原图已缩小):
self.colors={'1':'red','2':'orange','3':'yellow','4':'green','5':'blue','6':'puple'} 注意:图的颜色分别与colors字典中对应。
当然如果觉得数轴很碍眼,那就在类类New_case() 中的plt.figure()之后加上
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
来源:https://www.cnblogs.com/codingchen/p/16192714.html
猜你喜欢
- 这篇文章主要介绍了python爬虫 正则表达式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 方法一 1.新建一个同名的数据库 2.再停掉sqlserver(注意不要分离数据库) 3.用原数据库的数据文件覆盖掉这个新建的数据库 4.再
- 本文为大家分享了mysql 5.7.17 winx64解压版安装配置方法,供大家参考,具体内容如下一、下载下载地址二、配置1. 解压下载的m
- 鸭子类型基本定义首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。以下是 * 中对鸭子类型得论述:在程
- 一、策略模式策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换。这意味着,让一个类的行为(
- 1.11 – 添加缎带修饰网页局部模块中右上角的蓝色缎带修饰是这个网站界面设计中的一个亮点,只要合理的运用CSS、PNG透明图片和绝对定位属
- 面试题:索引的作用?首先建立一张数据库表:create table single_table(id int not auto_increme
- 今天给大伙说说python发送邮件,官方的多余的话自己去百度好了,还有一大堆文档说实话不到万不得已的时候一般人都不会去看,回归主题:本人是m
- 我们在使用很多新闻系统的时候,都会发现一个问题,尤其是使用 HtmlEdit 从WORD文档中直接拷贝文章(尤其里面有复杂表格和文字)的时候
- 本文实例讲述了JS实现仿Windows经典风格的选项卡Tab切换代码。分享给大家供大家参考,具体如下:这款仿Windows风格的选项卡,带有
- 目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情
- 前言前些日子了解到mqtt这样一个协议,可以在web上达到即时通讯的效果,但网上并不能很方便地找到一篇目前版本的在node下正确实现这个协议
- python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指
- 预测结果转为numpy:logits=model(feature)#如果模型是跑在GPU上result=logits.data.cpu().
- SQLServer数据库从高版本降级到低版本实例详解由于目前还广泛使用着SQLServer2000,很多公司又想使用新的SQLServer,
- 这篇文章主要介绍了postman和python mock测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 一、介绍我想做的是基于人脸识别的表情(情绪)分析。看到网上也是有很多的开源库提供使用,为开发提供了很大的方便。我选择目前用的比较多的dlib
- temp.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti
- 场景可能是你用不到,但是我遇到了这样一个问题,就是我想详细了解我的竞争对手的网站(电商类)销售情况和新品上架情况,但是我总不至于像盯盘一样,
- 1.删除所有的目录,只保留datasharebin2.删除BIN下面除以下三个文件之外的所有文件:libmysql.dll(MYSQL5中的