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

来源:https://www.cnblogs.com/codingchen/archive/2022/04/26/16192714.html
-Advertisement-
Play Games

鑒於上一篇中最後三個問題: 1、上述程式是否能進行優化(比如功能相同的) 2、創建三個3個實例,用了3個語句,能否建一個函數,只輸入一個數n,就自動創建n個實例?同時,每個實例的num_times隨機,(n比較大時,num_times應該比較小) 3、當實現上述功能後,程式運行,只輸入一個參數(創建 ...


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

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為什麼這裡不再用,是因為這裡迴圈的時候一直出現紅色R
eds,為了對比,創建了一新字典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) 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常用的有以下註釋 單行忽略 // @ts-ignore 忽略全文;如果你使用這樣,需要放在ts的最頂部哈。 // @ts-nocheck 如下 <script lang="ts" setup> // @ts-nocheck import { computed } from 'vue-demi' do ...
  • 大家好,我是半夏👴,一個剛剛開始寫文的沙雕程式員.如果喜歡我的文章,可以關註➕ 點贊 👍 加我微信:frontendpicker,一起學習交流前端,成為更優秀的工程師~關註公眾號:搞前端的半夏,瞭解更多前端知識! 點我探索新世界! 原文鏈接 ==>http://sylblog.xin/archi ...
  • 前段時間在Android原生搞的BLE掃碼槍又要移植到小程式上來。本以為小程式不支持BLE的,結果一搜,還真支持-_-|| 。 藍牙部分問題不大,遇到的主要問題是,小程式環境如何對字元編碼進行判斷以及如何進行編碼轉文字的問題。 掃了一陣,搜到了TextDecoder。結果小程式環境不支持……。 隨後 ...
  • 解釋器模式是什麼 解釋器是一種行為型設計模式,指給分析對象定義一個語言,並定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的實例。這種模式實現了文法表達式處理的介面,該介面解釋一個特定的上下文。 為什麼用解釋器模式 在軟體開發中,會遇到有些問題多次重覆 ...
  • 訪問者模式是什麼 訪問者是一種行為型設計模式, 允許你在不修改已有代碼的情況下向已有類層次結構中增加新的行為。 為什麼用訪問者模式 訪問者模式建議將新行為放入一個名為訪問者的獨立類中,而不是試圖將其整合到已有類中。現在需要執行操作的原始對象將作為參數被傳遞給訪問者中的方法, 讓方法能訪問對象所包含的 ...
  • 有了《系統架構的11條原則》,真正到設計階段還有另外11個考慮。 系統正確性 考慮一:負負得正 假如我們看到某個代碼,明顯有邏輯錯誤,想隨手改改。你就要考慮一件事情:這段明顯有問題的代碼為什麼線上上運行著沒有人來報bug?有一種正常運行叫做【負負得正】。如果把錯誤的邏輯改對了反而可能引起問題。 這種 ...
  • 組織管理模塊屬於SaaS產品非常底層的架構,非常考驗架構能力,幾乎所有的業務場景都需要應用組織數據,背後反應的是企業決策層的經營戰略和財務戰略,因此需要掌握一定的企業管理知識和財務知識,如果能夠掌握組織管理的概念和要點,對設計好SaaS產品幫助巨大。 ...
  • 如果軟體系統存在持續的迭代周期,那麼其中業務、技術、架構的複雜性都會直線拉升,其相應的開發難度也會提高,隨之而來的壓力會持續在開發和測試之間來回橫跳。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...