當(dāng)學(xué)會(huì)了制作散點(diǎn)圖和折線(xiàn)圖這些初級(jí)操作,我們就來(lái)學(xué)習(xí)用類(lèi)制作隨機(jī)漫步數(shù)據(jù),并使用matplotlib將之呈現(xiàn)出來(lái)
1、創(chuàng)建Randomwalk類(lèi)
from random import choice
class Randomwalk():
#一個(gè)生成隨機(jī)漫步數(shù)據(jù)的類(lèi)
def __init__(self,num_points=5000):
"""初始化隨機(jī)漫步的屬性"""
self.num_points = num_points
#所有的隨機(jī)數(shù)據(jù)都起始于(0,0)
self.x_values = [0]
self.y_values = [0]
我們先創(chuàng)建一個(gè)類(lèi),創(chuàng)建了x,y兩個(gè)列表并設(shè)置初始數(shù)據(jù)從(0,0)開(kāi)始,隨機(jī)漫步的默認(rèn)點(diǎn)數(shù)為5000,這已經(jīng)足夠的大。此外,我們引入random模塊中的choice函數(shù),來(lái)隨機(jī)生成哪有選擇。
2、選擇方向
def fill_walk(self):
"""計(jì)算隨機(jī)漫步的所有點(diǎn)"""
while len(self.x_values) < self.num_points:
#設(shè)置前進(jìn)的方向和距離
x_direction = choice([1,-1])
x_distance = choice([0,1,2,3,4])
x_step = x_direction * x_distance
y_direction = choice([1,-1])
y_distance = choice([0,1,2,3,4])
y_step = y_direction * y_distance
#拒絕原地踏步
if x_step == 0 and y_step == 0:
continue
next_x = self.x_values[-1] + x_step
next_y = self.y_values[-1] + y_step
self.x_values.append(next_x)
self.y_values.append(next_y)
這個(gè)方法主要是告訴python:左走右走?走多少步?上走下走?走多少步?
首先,我們使用了while循環(huán),當(dāng)隨機(jī)數(shù)據(jù)少于我們初定值時(shí),這個(gè)將不斷循環(huán)。
其次,我們使用了choice()函數(shù),用choice(【1,-1】)給x_direction選擇一個(gè)值,結(jié)果要么是向右走的1,要么是向左走的-1,并給定了choice(【0,1,2,3,4】)四個(gè)值隨機(jī)選擇一個(gè)整數(shù),作為步數(shù)x_distance,然后我們用步數(shù)乘以方向作為沿x,y軸移動(dòng)的距離。如果x_step為正,則代表向右走,為負(fù),則代表向左走,為零則垂直移動(dòng);如果y_step為正則向上走,為負(fù)則向下走,為零則水平移動(dòng)。當(dāng)然如果x_step和y_step均為零,則意味著原地不動(dòng),所以我們拒絕這種情況,當(dāng)出現(xiàn)兩者均為零時(shí),我們使用了continue,返回到while循環(huán)繼續(xù)執(zhí)行。
最后,為了持續(xù)獲取x,y的數(shù)值,我們生成一個(gè)列表,每隨機(jī)選擇一個(gè)移動(dòng)數(shù)據(jù),我們就用此移動(dòng)數(shù)據(jù)加上原先的數(shù)據(jù)位置點(diǎn),并將此添加到相應(yīng)的列表末尾,以作下次使用,如:self.x_values[-1]
3、用matplotlib繪制隨機(jī)漫步圖
import matplotlib.pyplot as plt
from randomwalk import Randomwalk
#創(chuàng)建一個(gè)實(shí)例,并將其所包含的點(diǎn)都繪制出來(lái)#
rw = Randomwalk()
rw.fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=15)
plt.show()
首先倒入matplotlib中的pyplot模塊和randomwalk類(lèi),然后創(chuàng)建了Randomwalk實(shí)例,并將其存儲(chǔ)在rw中,在調(diào)用fill_walk,將數(shù)據(jù)傳給scatter()中,并選擇合適的尺寸點(diǎn)。
隨機(jī)生成的圖為(當(dāng)然,每次隨機(jī)生成的圖都是不一樣的):
