مقدمه
در این درس، ما یک پروژه جالب برای تولید و مصورسازی داده خواهیم ساخت: «پیادهروی تصادفی» یا
Random Walk. یک پیادهروی تصادفی، مسیری است که از مجموعهای از قدمهای تصادفی تشکیل شده
است. این مفهوم در بسیاری از حوزههای علوم طبیعی، فیزیک و اقتصاد برای مدلسازی پدیدههایی مانند
حرکت یک مولکول در گاز یا نوسانات قیمت سهام به کار میرود. ما با ساخت یک کلاس برای این مفهوم،
دادههای جالبی تولید کرده و آنها را با Matplotlib مصورسازی خواهیم کرد.
ایجاد کلاس RandomWalk
برای مدلسازی یک پیادهروی تصادفی، ما یک کلاس به نام RandomWalk میسازیم. این کلاس مسئولیت
تولید تمام نقاط مسیر را بر عهده خواهد داشت. یک فایل جدید به نام random_walk.py ایجاد
کنید.
random_walk.py
from random import choice
class RandomWalk:
"""A class to generate random walks."""
def __init__(self, num_points=5000):
"""Initialize attributes of a walk."""
self.num_points = num_points
self.x_values = [0]
self.y_values = [0]
def fill_walk(self):
"""Calculate all the points in the walk."""
while len(self.x_values) < self.num_points:
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
x = self.x_values[-1] + x_step
y = self.y_values[-1] + y_step
self.x_values.append(x)
self.y_values.append(y)
در این کلاس، ما ابتدا تعداد نقاط مورد نظر برای پیادهروی را مشخص میکنیم. دو لیست
x_values و y_values برای ذخیره مختصات هر نقطه در مسیر در نظر گرفته شدهاند که با
نقطه شروع (0, 0) مقداردهی اولیه میشوند.
متد fill_walk منطق اصلی تولید نقاط را در خود دارد. در یک حلقه، ما به صورت تصادفی جهت و
فاصله حرکت در هر دو محور x و y را انتخاب میکنیم. سپس موقعیت جدید را محاسبه کرده و
به لیست مختصات اضافه میکنیم. این حلقه تا زمانی که به تعداد نقاط مورد نظر برسیم، ادامه پیدا
میکند.
رسم نمودار پیادهروی تصادفی
اکنون که کلاسی برای تولید دادهها داریم، میتوانیم از آن برای ساخت یک پیادهروی و سپس رسم آن با
Matplotlib استفاده کنیم. ما از یک نمودار نقطهای (scatter plot) برای نمایش هر نقطه استفاده
خواهیم کرد. یک فایل جدید به نام rw_visual.py بسازید.
rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
rw = RandomWalk()
rw.fill_walk()
plt.style.use('classic')
fig, ax = plt.subplots()
ax.scatter(rw.x_values, rw.y_values, s=15)
plt.show()
keep_running = input("Make another walk? (y/n): ")
if keep_running == 'n':
break
این کد یک حلقه بینهایت ایجاد میکند که در هر تکرار، یک نمونه جدید از RandomWalk ساخته، متد
fill_walk آن را فراخوانی کرده و سپس با استفاده از ax.scatter، نقاط تولید شده را روی نمودار
رسم میکند. پس از هر بار نمایش نمودار، برنامه از کاربر میپرسد که آیا میخواهد یک پیادهروی جدید
بسازد یا خیر.
سفارشیسازی نمودار
نمودار ما کار میکند، اما میتوانیم با افزودن رنگ، حذف محورها و مشخص کردن نقاط شروع و پایان، آن
را بسیار جذابتر و خواناتر کنیم.
rw_visual.py
point_numbers = range(rw.num_points)
ax.scatter(rw.x_values, rw.y_values, c=point_numbers, cmap=plt.cm.Blues,
edgecolors='none', s=1)
ax.scatter(0, 0, c='green', edgecolors='none', s=100)
ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolors='none', s=100)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
در این نسخه نهایی، ما از پارامتر c در متد scatter برای رنگآمیزی نقاط بر اساس ترتیب
آنها استفاده کردهایم. با پاس دادن یک لیست از اعداد و یک نقشه رنگ (colormap) مانند
plt.cm.Blues، نقاط ابتدایی مسیر با رنگ آبی روشن و نقاط انتهایی با رنگ آبی تیره نمایش داده
میشوند.
همچنین، ما نقاط شروع و پایان را با رنگها و اندازههای متفاوت دوباره ترسیم کردهایم تا به صورت
مشخص دیده شوند. در نهایت، با set_visible(False)، محورهای نمودار را پنهان کردهایم تا یک تصویر
تمیزتر داشته باشیم.
در این درس، ما با ساخت یک کلاس برای تولید دادههای یک پیادهروی تصادفی و مصورسازی آن با
Matplotlib، یک پروژه عملی و جالب را به پایان رساندیم. این فرآیند به خوبی نشان میدهد که چگونه
میتوان با ترکیب تولید داده و مصورسازی، به درک بهتری از پدیدههای مختلف رسید. در درس بعدی، به
سراغ «پرتاب تاس با Plotly» خواهیم رفت و با یک کتابخانه مصورسازی دیگر برای ساخت نمودارهای تعاملی
آشنا خواهیم شد.