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

PursuitingPeak發表於2022-04-26

 鑑於上一篇中最後三個問題:

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) 

相關文章