話不多說,先上幾張結(jié)果圖




目標(biāo)
利用python程序模擬花粉在水滴表面的運動軌跡,即隨機漫步
隨機漫步(Random walk)是一種數(shù)學(xué)統(tǒng)計模型,它由一連串軌跡所組成。其中每一次都是隨機的,它能用來表示不規(guī)則的變動形式。氣體或液體中分子活動的軌跡等可作為隨機漫步的模型
分析
為了模擬隨機漫步,可以先創(chuàng)建一個 RandomWork 的類,給這個類創(chuàng)建三個屬性,一是用于存儲隨機漫步次數(shù)的變量,另外兩個是用于存放隨機漫步每個點的x和y的坐標(biāo)。把相關(guān)數(shù)據(jù)存儲好后,再利用python的強大的庫 matplotlib 把數(shù)據(jù)繪制成圖表
詳細(xì)代碼
生成隨機漫步數(shù)據(jù)
from random import choice
class RandomWalk():
'''一個生成隨機漫步數(shù)據(jù)的類'''
def __init__(self, num_points=5000):
'''初始化隨機漫步的屬性'''
self.num_points = num_points
# 所有隨機漫步都始于(0,0)
self.x_values = [0]
self.y_values = [0]
def get_step(self):
'''計算每一個步數(shù)'''
# 決定前進(jìn)的方向以及沿這個方向前進(jìn)的步數(shù)
direction = choice([1, -1])
distance = choice([0, 1, 2, 3, 4])
return direction * distance
def fill_walk(self):
'''計算隨機漫步包含的所有點'''
# 不斷漫步,直到列表到指定的長度
while len(self.x_values) < self.num_points:
# 獲得步數(shù)(注意方法的調(diào)用)
x_step = self.get_step()
y_step = self.get_step()
# 拒絕原地踏步
if x_step == 0 and y_step == 0:
continue
# 計算下一個點的x和y值
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)
實現(xiàn)數(shù)據(jù)可視化
import matplotlib.pyplot as plt
from random_walk2 import RandomWalk
# 創(chuàng)建一個RandomWalk實例,并將其包含的點都繪制出來
rw = RandomWalk(50000)
rw.fill_walk()
# 設(shè)置繪圖窗口的尺寸,單位是英寸
plt.figure(figsize=(10, 6))
# 通過散點圖表示數(shù)據(jù)
point_numbers = list(range(rw.num_points))
plt.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues, edgecolors="none", s=1)
# 設(shè)置起點和終點的樣式
plt.scatter(0, 0, c='green', edgecolors="none", s=100)
plt.scatter(rw.x_values[-1], rw.y_values[-1], c=(1, 0, 0), edgecolors="none", s=100)
# 隱藏坐標(biāo)軸
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
拓展
如果想把軌跡用線連接起來,只需要把“通過散點圖表示數(shù)據(jù)”那段代碼和導(dǎo)包修改,如下
import matplotlib.pyplot as plt
plt.plot(rw.x_values, rw.y_values, linewidth=1)
這么漂亮的圖表當(dāng)然會有想保存的沖動,只需要修改 plt.show 修改成 plt.savefig('此處填入保存的文件名')