Python+matplotlib調(diào)用隨機(jī)函數(shù)生成變化圖形
前言
綜合前述的類、函數(shù)、matplotlib等,完成一個(gè)隨機(jī)移動(dòng)的過(guò)程(注意要確定移動(dòng)的次數(shù),比如10萬(wàn)次),每次行走都完全是隨機(jī)的,沒(méi)有明確的方向,結(jié)果是由一系列隨機(jī)決策確定的,最后顯示出每次移動(dòng)的位置的圖表。
思考:
1)每次走動(dòng)多少個(gè)像素,由隨機(jī)函數(shù)決定,每次移動(dòng)方向也隨機(jī)確定。由隨機(jī)方向和隨機(jī)像素共同移動(dòng)位置大小和方向。
2)保證將每次移動(dòng)的位置保存在列表中,供后面matplotlib調(diào)用,生成圖表。
故而,可以分成兩個(gè)文件,一個(gè)為rand_moving類,生成走動(dòng)像素、方向,并記錄相關(guān)數(shù)據(jù),保存在數(shù)列中,另一個(gè)為繪圖模塊randdraw_visual ,調(diào)用matplotlib和rand_moving類,生成一個(gè)實(shí)例,并調(diào)用計(jì)算出的數(shù)列組生成圖表。
一、rand_moving.py文件定義功能如下
1、初始化程序,設(shè)置一個(gè)參數(shù),即移動(dòng)的次數(shù),初始化位置全部設(shè)置為0
2、隨機(jī)生成x,y的方向和移動(dòng)像素,并相乘,得到相對(duì)移動(dòng)距離,即為每次移動(dòng)的距離和方向,即需要4個(gè)隨機(jī)函數(shù)來(lái)分別確定水平方向和垂直方向的 移動(dòng)位置大小和方向,
3,計(jì)算出下一個(gè)位置,并進(jìn)行保存到位置數(shù)列中,即每走完一步后,在屏幕中的絕對(duì)位置。
如下:
from random import choice #random是系統(tǒng)自帶的隨機(jī)函數(shù)模塊 class Rand_moving(): #定義一個(gè)Rand_moving類 def __init__(self,num_times=100000): # 初始化,設(shè)置默認(rèn)參數(shù)為10萬(wàn),可以修改這個(gè)參數(shù)試試機(jī)器運(yùn)行速度 self.num_times = num_times #移動(dòng)次數(shù) self.x_values=[0] # 設(shè)置兩個(gè)數(shù)列,用來(lái)保存每一步的位置,初始位置為(0, 0),數(shù)列元素個(gè)數(shù)會(huì)一直增加到num_times,用來(lái)記錄每一步的位置信息 self.y_values=[0] def fill_moving(self): #定義一個(gè)函數(shù),用來(lái)計(jì)算移動(dòng)方向和距離,并計(jì)算需要保存的位置信息 while len(self.x_values)<self.num_times:#循環(huán)不斷運(yùn)行,直到漫步包含所需數(shù)量的點(diǎn)num_times x_direction = choice([1,-1]) #x的移動(dòng)方向,1向上,0不變,-1向下 x_distance = choice([0,1,2,3,4,5]) #x的每次移動(dòng)的像素, x_step = x_direction*x_distance #移動(dòng)方向乘以移動(dòng)距離,以確定沿x移動(dòng)的距離 y_direction = choice([1,-1]) #y的移動(dòng)方向,1向上,0不變,-1向下 y_distance = choice([0,1,2,3,4,5]) #y的每次移動(dòng)的像素, y_step = y_direction*y_distance #移動(dòng)方向乘以移動(dòng)距離,以確定沿y移動(dòng)的距離 #原地不變 if x_step ==0 and y_step==0: # x_step和 y_step都為零,則意味著原地踏步 continue #計(jì)算下一個(gè)點(diǎn)的位置坐標(biāo)x和y值,并分別保存到數(shù)列x_values和y_values中 next_x = self.x_values[-1] + x_step #self.x_values[-1]表示是數(shù)列最后一個(gè)值,初始為x_values=[0] next_y = self.y_values[-1] + y_step self.x_values.append(next_x ) #將每次計(jì)算的next_x存入到數(shù)列x_values中 self.y_values.append(next_y ) #將每次計(jì)算的next_y存入到數(shù)列y_values中
二、繪圖模塊
randdraw_visual.py
繪圖模塊randdraw_visual.py的功能如下:
1、調(diào)用matplotlib和rand_moving類;
2、rand_moving生成一個(gè)實(shí)例,并計(jì)算出的數(shù)列組生成圖表;
3、用matplotlib中的方法生成圖表
import matplotlib.pyplot as plt #導(dǎo)入matplotlib模塊 from rand_moving import * #也可以用 import random_moving 注意使用過(guò)程中的細(xì)微差別 ,小寫(xiě)開(kāi)頭的rand_moving是文件(或稱為模塊,一個(gè)模塊中可以有一個(gè)類,或多個(gè)類),大寫(xiě)開(kāi)頭Rand_moving是類。 rm = Rand_moving() # 利用導(dǎo)入的 Rand_moving 類,創(chuàng)建一個(gè)實(shí)例rm,這里沒(méi)有給定參數(shù),默認(rèn)是10萬(wàn),可以修改為其他數(shù)據(jù)。 rm.fill_moving() # 調(diào)用類的方法fill_moving() ,并生成隨機(jī)數(shù)列,存入到x_values和y_values中, plt.scatter(rm.x_values, rm.y_values,s=15)#調(diào)用實(shí)例rm中位置數(shù)列x_values和y_values生成圖表 plt.show()
程序運(yùn)行效果(注意,為了對(duì)比,程序中創(chuàng)建了3個(gè)實(shí)例,其中一個(gè)為默認(rèn)值,另兩個(gè)為50萬(wàn)和5萬(wàn),如果一直沒(méi)顯示,請(qǐng)耐心等會(huì)兒!)
上述三個(gè)實(shí)例處在同一圖中,呈現(xiàn)不同顏色,如果只有一個(gè)實(shí)例,如何修改顏色?
入門(1)中,語(yǔ)句 plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues,edgecolor='none', s=40) 是修改漸變色的,可償試將randdraw_visual.py模塊中進(jìn)行如下修改:
plt.scatter(rm.x_values, rm.y_values,c=y_values, cmap=plt.cm.Reds,edgecolor='none',s=15)
注: c的參數(shù)是字符串,可以直接使用顏色的英文進(jìn)行賦值,比如:c='yellow',見(jiàn)后面修改起點(diǎn)、終點(diǎn)顏色。
指定一個(gè)紅色,一個(gè)藍(lán)色,實(shí)際運(yùn)行效果(有重復(fù)的地方,實(shí)例設(shè)置為藍(lán)色在后面,將紅色蓋?。?/p>
除些之外,還可以對(duì)特定的點(diǎn)進(jìn)行設(shè)定,也就是在語(yǔ)句plt.scatter(rm.x_values, rm.y_values,c=y_values, cmap=plt.cm.Reds,edgecolor='none',s=15)之后,再多幾個(gè)相關(guān)語(yǔ)句,并給定相關(guān)點(diǎn)坐標(biāo)。
import matplotlib.pyplot as plt from rand_moving import * #也可以用import random_moving注意使用過(guò)程中的差別 rm = Rand_moving() # 創(chuàng)建一個(gè)實(shí)例rm,這里沒(méi)有給定參數(shù),默認(rèn)是10萬(wàn),可以修改為其他數(shù)據(jù)。 rm.fill_moving() # 調(diào)用類的方法fill_moving() ,并生成隨機(jī)數(shù)列,存入到x_values和y_values中 plt.scatter(rm.x_values,rm.y_values,c=rm.y_values,cmap=plt.cm.Reds,edgecolor='none',s=15) #調(diào)用實(shí)例rm中數(shù)列x_values和y_values生成圖表#調(diào)用實(shí)例rm中數(shù)列x_values和y_values生成圖表 new_rm = Rand_moving(500000) # 創(chuàng)建一個(gè)實(shí)例new_rm,是50萬(wàn)次 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) # 重繪起點(diǎn),終點(diǎn) #因?yàn)閮蓚€(gè)實(shí)例的起點(diǎn)一樣,只需一個(gè)起點(diǎn)即可 plt.scatter(rm.x_values[0], rm.y_values[0],c='yellow',edgecolor='none',s=100) #設(shè)置起點(diǎn),把s設(shè)置較大,以示區(qū)別 #兩個(gè)實(shí)例終點(diǎn)不同,分別重繪終點(diǎn)位置 plt.scatter(rm.x_values[-1], rm.y_values[-1],c='brown',edgecolor='none',s=100) #設(shè)置實(shí)例rm的終點(diǎn),思考為什么用[-1] plt.scatter(new_rm.x_values[-1], new_rm.y_values[-1],c='pink',edgecolor='none',s=100) #設(shè)置實(shí)例new_rm的終點(diǎn) plt.show()
實(shí)際運(yùn)行效果:
顯示圖表屏幕大小
圖表適合屏幕大小能有效地將數(shù)據(jù)中的規(guī)律呈現(xiàn)出來(lái),如果要調(diào)整屏幕大小,可調(diào)整matplotlib輸出的尺寸
plt.figure(dpi=128,figsize=(12, 10))
函數(shù) figure() 用于指定圖表的寬度、高度、分辨率和背景色。
形參 figsize 指定一個(gè)元組
形參 dpi 向 figure() 傳遞該分辨率
注意:plt.figure(dpi=128,figsize=(12, 10))語(yǔ)句要在其他plt開(kāi)始語(yǔ)句的前面,才能調(diào)整顯示屏幕的大小。
import matplotlib.pyplot as plt from rand_moving import * #也可以用import random_moving注意使用過(guò)程中的差別 #調(diào)整屏幕大小 plt.figure(dpi=128,figsize=(12, 10)) #一開(kāi)始就要定義顯示的大小,當(dāng)然,可以試一下,放到plt.show()之前其他位置的運(yùn)行效果。 rm = Rand_moving() # 創(chuàng)建一個(gè)實(shí)例rm,這里沒(méi)有給定參數(shù),默認(rèn)是10萬(wàn),可以修改為其他數(shù)據(jù)。 rm.fill_moving() # 調(diào)用類的方法fill_moving() ,并生成隨機(jī)數(shù)列,存入到x_values和y_values中 plt.scatter(rm.x_values,rm.y_values,c=rm.y_values,cmap=plt.cm.Reds,edgecolor='none',s=15) #調(diào)用實(shí)例rm中數(shù)列x_values和y_values生成圖表#調(diào)用實(shí)例rm中數(shù)列x_values和y_values生成圖表 new_rm = Rand_moving(500000) # 創(chuàng)建一個(gè)實(shí)例new_rm,是50萬(wàn)次 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()
當(dāng)然,還可以試一下他函數(shù)功能。
是不是有點(diǎn)小小的成就感!
小結(jié)
請(qǐng)思考:
1、上述程序是否能進(jìn)行優(yōu)化(比如功能相同的)
2、創(chuàng)建三個(gè)3個(gè)實(shí)例,用了3個(gè)語(yǔ)句,能否建一個(gè)函數(shù),只輸入一個(gè)數(shù)n,就自動(dòng)創(chuàng)建n個(gè)實(shí)例?同時(shí),每個(gè)實(shí)例的num_times隨機(jī),(n比較大時(shí),num_times應(yīng)該比較小)
3、當(dāng)實(shí)現(xiàn)上述功能后,程序運(yùn)行,只輸入一個(gè)參數(shù)(創(chuàng)建實(shí)例的個(gè)數(shù)),就會(huì)自動(dòng)生成對(duì)應(yīng)的num_times,并分別調(diào)用相關(guān)函數(shù)生成對(duì)應(yīng)圖表。
以上就是Python+matplotlib調(diào)用隨機(jī)函數(shù)生成變化圖形的詳細(xì)內(nèi)容,更多關(guān)于Python隨機(jī)函數(shù)生成變化圖形的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析
這篇文章主要介紹了python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析的實(shí)例,幫助大家更好的理解和學(xué)習(xí)使用python。感興趣的朋友可以了解下2021-04-04ConvNeXt實(shí)戰(zhàn)之實(shí)現(xiàn)植物幼苗分類
ConvNeXts由標(biāo)準(zhǔn)ConvNet模塊構(gòu)建,在準(zhǔn)確性和可擴(kuò)展性方面與 Transformer競(jìng)爭(zhēng),實(shí)現(xiàn)87.8% ImageNet top-1 準(zhǔn)確率,在 COCO 檢測(cè)和 ADE20K 分割方面優(yōu)于 Swin Transformers。本文將利用ConvNeXt實(shí)現(xiàn)植物幼苗分類,需要的可以參考一下2022-01-01Python?對(duì)象拷貝及深淺拷貝區(qū)別的詳細(xì)教程示例
這篇文章主要介紹了Python?對(duì)象拷貝及深淺拷貝區(qū)別的詳細(xì)教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03在matplotlib中改變figure的布局和大小實(shí)例
這篇文章主要介紹了在matplotlib中改變figure的布局和大小實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python+numpy實(shí)現(xiàn)的基本矩陣操作示例
這篇文章主要介紹了python+numpy實(shí)現(xiàn)的基本矩陣操作,結(jié)合實(shí)例形式分析了Python使用numpy模塊針對(duì)矩陣進(jìn)行創(chuàng)建、增刪查改、索引、運(yùn)算相關(guān)操作實(shí)現(xiàn)技巧,注釋中包含有詳細(xì)的說(shuō)明,需要的朋友可以參考下2019-07-07Python中Jupyter notebook快捷鍵總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于Python中Jupyter notebook快捷鍵總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-04-04