python資料處理matplotlib入門(2)-利用隨機函式生成變化圖形

PursuitingPeak發表於2022-04-25

綜合前述的類、函式、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萬,如果一直沒顯示,請耐心等會兒!)

 上述三個例項處在同一圖中,呈現不同顏色,如果只有一個例項,如何修改顏色?

入門(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',見後面修改起點、終點顏色。
指定一個紅色,一個藍色,實際執行效果(有重複的地方,例項設定為藍色在後面,將紅色蓋住):

除些之外,還可以對特定的點進行設定,也就是在語句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()

實際執行效果:

顯示圖表螢幕大小

圖表適合螢幕大小能有效地將資料中的規律呈現出來,如果要調整螢幕大小,可調整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()

 當然,還可以試一下他函式功能。 

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

相關文章