مقدمه

در این درس، ما یک پروژه جالب برای تولید و مصورسازی داده خواهیم ساخت: «پیاده‌روی تصادفی» یا Random Walk. یک پیاده‌روی تصادفی، مسیری است که از مجموعه‌ای از قدم‌های تصادفی تشکیل شده است. این مفهوم در بسیاری از حوزه‌های علوم طبیعی، فیزیک و اقتصاد برای مدل‌سازی پدیده‌هایی مانند حرکت یک مولکول در گاز یا نوسانات قیمت سهام به کار می‌رود. ما با ساخت یک کلاس برای این مفهوم، داده‌های جالبی تولید کرده و آنها را با Matplotlib مصورسازی خواهیم کرد.

ایجاد کلاس RandomWalk

برای مدل‌سازی یک پیاده‌روی تصادفی، ما یک کلاس به نام RandomWalk می‌سازیم. این کلاس مسئولیت تولید تمام نقاط مسیر را بر عهده خواهد داشت. یک فایل جدید به نام random_walk.py ایجاد کنید.

Copy Icon 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
        
        # All walks start at (0, 0).
        self.x_values = [0]
        self.y_values = [0]

    def fill_walk(self):
        """Calculate all the points in the walk."""
        # Keep taking steps until the walk reaches the desired length.
        while len(self.x_values) < self.num_points:
            # Decide which direction to go and how far to go in that direction.
            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

            # Reject moves that go nowhere.
            if x_step == 0 and y_step == 0:
                continue
                
            # Calculate the new position.
            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 بسازید.

Copy Icon rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk

# Keep making new walks, as long as the program is active.
while True:
    # Make a random walk.
    rw = RandomWalk()
    rw.fill_walk()

    # Plot the points in the 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، نقاط تولید شده را روی نمودار رسم می‌کند. پس از هر بار نمایش نمودار، برنامه از کاربر می‌پرسد که آیا می‌خواهد یک پیاده‌روی جدید بسازد یا خیر.

سفارشی‌سازی نمودار

نمودار ما کار می‌کند، اما می‌توانیم با افزودن رنگ، حذف محورها و مشخص کردن نقاط شروع و پایان، آن را بسیار جذاب‌تر و خواناتر کنیم.

Copy Icon rw_visual.py
# Inside the while loop:
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)

# Emphasize the first and last points.
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)

# Remove the axes.
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)

در این نسخه نهایی، ما از پارامتر c در متد scatter برای رنگ‌آمیزی نقاط بر اساس ترتیب آنها استفاده کرده‌ایم. با پاس دادن یک لیست از اعداد و یک نقشه رنگ (colormap) مانند plt.cm.Blues، نقاط ابتدایی مسیر با رنگ آبی روشن و نقاط انتهایی با رنگ آبی تیره نمایش داده می‌شوند.

همچنین، ما نقاط شروع و پایان را با رنگ‌ها و اندازه‌های متفاوت دوباره ترسیم کرده‌ایم تا به صورت مشخص دیده شوند. در نهایت، با set_visible(False)، محورهای نمودار را پنهان کرده‌ایم تا یک تصویر تمیزتر داشته باشیم.

در این درس، ما با ساخت یک کلاس برای تولید داده‌های یک پیاده‌روی تصادفی و مصورسازی آن با Matplotlib، یک پروژه عملی و جالب را به پایان رساندیم. این فرآیند به خوبی نشان می‌دهد که چگونه می‌توان با ترکیب تولید داده و مصورسازی، به درک بهتری از پدیده‌های مختلف رسید. در درس بعدی، به سراغ «پرتاب تاس با Plotly» خواهیم رفت و با یک کتابخانه مصورسازی دیگر برای ساخت نمودارهای تعاملی آشنا خواهیم شد.