Kahibaro
Discord Login Register

مصورسازی داده با matplotlib

مقدمه‌ای کوتاه بر مصورسازی با matplotlib

در فصل «علم داده با پایتون» دیدید که مصورسازی داده چرا مهم است. در این بخش فقط روی یک ابزار مشخص تمرکز می‌کنیم: کتابخانهٔ matplotlib، به‌خصوص زیر‌ماژول معروف آن یعنی matplotlib.pyplot.

ایدهٔ اصلی: با matplotlib می‌توانید داده‌ها را به نمودارهای مختلف تبدیل کنید: خطی، ستونی، پراکندگی و … و ظاهر آن‌ها را تنظیم کنید.

در تمام مثال‌ها فرض می‌کنیم قبلاً کتابخانه نصب شده و کار با محیط پایتون را می‌دانید.

برای شروع معمولاً این دو خط را می‌نویسیم:

import matplotlib.pyplot as plt
import numpy as np   # برای ساخت داده‌ی نمونه (در صورت نیاز)

plt نام کوتاهی است که تقریباً همهٔ مستندات و مثال‌ها از آن استفاده می‌کنند.


ساخت اولین نمودار ساده

یک نمودار خطی (line plot) ساده:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [2, 4, 3, 5]
plt.plot(x, y)    # رسم نمودار خطی
plt.show()        # نمایش نمودار

نکته‌ها:

برچسب‌گذاری و عنوان نمودار

نمودار بدون توضیح، برای خواننده مبهم است. با چند تابع ساده می‌توانیم آن را قابل فهم کنیم:

x = [1, 2, 3, 4]
y = [2, 4, 3, 5]
plt.plot(x, y)
plt.title("رشد فروش در ۴ فصل")
plt.xlabel("فصل")
plt.ylabel("میزان فروش")
plt.grid(True)
plt.show()

اگر از فارسی در عنوان و برچسب‌ها استفاده می‌کنید، ممکن است بسته به فونتِ سیستم ظاهر آن کمی متفاوت باشد. برای شروع، همین سطح کافی است.


تعیین رنگ، سبک خط و علامت نقاط

تابع plot می‌تواند شکل ظاهری نمودار را تغییر دهد:

چند روش استفاده:

روش کوتاه (یک رشتهٔ ترکیبی)

الگوی کلی:

text
'markerlinestylecolor'

مثال:

x = [1, 2, 3, 4]
y = [2, 4, 3, 5]
plt.plot(x, y, 'ro-')
plt.show()

روش پارامتر جداگانه

plt.plot(
    x, y,
    color='green',     # یا 'g'
    linestyle='--',    # خط‌چین
    marker='o'         # علامت دایره
)
plt.show()

چند گزینهٔ پرکاربرد:

رسم چند نمودار در یک شکل

گاهی می‌خواهید چند سری داده را روی یک محور رسم کنید؛ کافی است چند بار plt.plot را قبل از plt.show() صدا بزنید.

x = [1, 2, 3, 4]
y1 = [2, 4, 3, 5]
y2 = [1, 3, 2, 4]
plt.plot(x, y1, 'bo-', label='محصول A')
plt.plot(x, y2, 'rs--', label='محصول B')
plt.title("مقایسه فروش دو محصول")
plt.xlabel("فصل")
plt.ylabel("فروش")
plt.legend()   # نمایش راهنما (legend)
plt.show()

تابع plt.legend() برچسب‌هایی را که با label= مشخص کرده‌ایم در کنار نمودار نمایش می‌دهد. محل نمایش را می‌توان با loc تنظیم کرد، مثلاً:

نمودار ستونی (Bar Chart)

برای مقایسهٔ رده‌ها (دسته‌ها) مثل کشورها، محصولات، سال‌ها، نمودار ستونی مناسب است.

تابع اصلی: plt.bar()

cities = ["تهران", "اصفهان", "شیراز", "تبریز"]
population = [9.0, 2.0, 1.6, 1.5]
plt.bar(cities, population)
plt.title("جمعیت تقریبی چند شهر (میلیون نفر)")
plt.xlabel("شهر")
plt.ylabel("جمعیت (میلیون نفر)")
plt.show()

دو مجموعه داده در نمودار ستونی

برای دو گروه (مثلاً سال ۲۰۲۳ و ۲۰۲۴)، معمولاً ستون‌ها را کمی جابه‌جا می‌کنیم تا روی هم نیفتند. برای این کار بهتر است با اندیس عددی کار کنیم؛ از range یا numpy استفاده می‌کنیم.

import numpy as np
import matplotlib.pyplot as plt
labels = ["A", "B", "C"]
values_2023 = [10, 15, 7]
values_2024 = [12, 13, 9]
x = np.arange(len(labels))   # 0, 1, 2
width = 0.35                 # پهنای هر ستون
plt.bar(x - width/2, values_2023, width, label="۲۰۲۳")
plt.bar(x + width/2, values_2024, width, label="۲۰۲۴")
plt.xticks(x, labels)  # به‌جای 0,1,2 برچسب‌های A,B,C را نشان بده
plt.title("مقایسه مقادیر در دو سال")
plt.xlabel("گروه")
plt.ylabel("مقدار")
plt.legend()
plt.show()

نمودار پراکندگی (Scatter Plot)

در علم داده، پراکندگی (scatter) برای بررسی رابطهٔ بین دو متغیر عددی بسیار مهم است (مثلاً قد و وزن، ساعات مطالعه و نمره).

تابع اصلی: plt.scatter()

hours_study = [1, 2, 3, 4, 5, 6]
scores = [40, 50, 55, 65, 70, 80]
plt.scatter(hours_study, scores)
plt.title("رابطه بین ساعات مطالعه و نمره")
plt.xlabel("ساعات مطالعه")
plt.ylabel("نمره")
plt.grid(True)
plt.show()

می‌توانید رنگ و اندازهٔ نقاط را هم کنترل کنید:

plt.scatter(
    hours_study,
    scores,
    color='purple',
    s=80,          # اندازه‌ی نقاط
    marker='o'
)

اگر هر نقطه یک ویژگی اضافی داشته باشد (مثلاً شدت، جمعیت)، می‌توانید آن را با اندازه (s) یا رنگ (c) نمایش دهید. این موضوع در تحلیل‌های جدی‌تر داده پرکاربرد است.


نمودار هیستوگرام (Histogram)

هیستوگرام برای نمایش توزیع داده‌های عددی مفید است؛ مثلاً پخش نمره‌های یک کلاس.

تابع اصلی: plt.hist()

import numpy as np
import matplotlib.pyplot as plt
# تولید داده‌ی تصادفی (مثلاً نمره‌ها بین ۱۰ تا ۲۰)
scores = np.random.randint(10, 21, size=50)
plt.hist(scores, bins=5)   # داده را در ۵ بخش تقسیم کن
plt.title("توزیع نمره‌ها")
plt.xlabel("نمره")
plt.ylabel("تعداد دانش‌آموزان")
plt.show()

پارامتر bins تعداد «بخش‌ها» (ستون‌ها) را تعیین می‌کند؛ هرچه بیشتر باشد، نمودار جزئی‌تر می‌شود.


تنظیم محدودهٔ محورها و نسبت تصویر

گاهی بخشی از نمودار برایتان مهم‌تر است؛ می‌توانید محدودهٔ محورهای x و y را تنظیم کنید:

x = [1, 2, 3, 4, 5, 6]
y = [10, 15, 8, 20, 18, 25]
plt.plot(x, y, 'o-')
plt.xlim(0, 7)
plt.ylim(0, 30)
plt.title("تنظیم محدوده‌ی محور")
plt.show()

برای تنظیم نسبت تصویر (aspect) یا اندازهٔ کلی شکل:

plt.figure(figsize=(8, 4))   # عرض ۸ اینچ، ارتفاع ۴ اینچ
plt.plot(x, y, 'o-')
plt.title("نمودار در شکل پهن‌تر")
plt.show()

plt.figure() باید قبل از دستورات رسم (plot, bar, …) صدا زده شود.


ذخیره کردن نمودار به‌صورت تصویر

لازم نیست همیشه فقط از plt.show() استفاده کنید؛ می‌توانید نمودار را به‌صورت فایل تصویری ذخیره کنید.

تابع اصلی: plt.savefig()

x = [1, 2, 3, 4]
y = [2, 4, 3, 5]
plt.plot(x, y)
plt.title("نمودار نمونه")
plt.savefig("my_plot.png")   # ذخیره‌ی نمودار در کنار اسکریپت
plt.show()

نکته‌ها:

plt.savefig("my_plot_hd.png", dpi=300)

چند نمودار در یک شکل (Subplots)

گاهی می‌خواهید چند نمودار را در یک پنجره کنار هم داشته باشید. برای این کار از plt.subplots() استفاده می‌کنیم.

الگوی کلی:

fig, axes = plt.subplots(nrows, ncols, figsize=(عرض, ارتفاع))

مثال: دو نمودار در یک ردیف

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
# نمودار اول
axes[0].plot(x, y1)
axes[0].set_title("sin(x)")
# نمودار دوم
axes[1].plot(x, y2, color='red')
axes[1].set_title("cos(x)")
plt.tight_layout()  # کمی فاصله‌ها را تنظیم می‌کند
plt.show()

نکات:

کار با داده‌های جدولی (ترکیب با pandas به‌صورت سطحی)

جزئیات pandas در بخش خودش آمده است، اما در عمل معمولاً matplotlib را با pandas ترکیب می‌کنیم. در این‌جا فقط یک نمونهٔ ساده می‌آوریم تا ببینید دادهٔ جدولی چطور به نمودار تبدیل می‌شود.

فرض کنید یک فایل CSV دارید و با pandas آن را خوانده‌اید:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
    "year": [2019, 2020, 2021, 2022],
    "sales": [100, 120, 90, 150]
})
plt.plot(df["year"], df["sales"], 'o-')
plt.title("رشد فروش بر اساس سال")
plt.xlabel("سال")
plt.ylabel("فروش")
plt.grid(True)
plt.show()

در فصل «آشنایی با pandas» راه‌های مستقیم‌تر رسم نمودار با خود pandas را خواهید دید، اما دانستن این ترکیب پایه با matplotlib مهم است.


چند نکتهٔ کاربردی برای مصورسازی بهتر

۱. بیش از حد شلوغ نکنید
تعداد رنگ‌ها، خطوط و متن‌ها را معقول نگه دارید؛ نمودار باید ساده و خوانا باشد.

۲. همیشه واحد و معنی محور‌ها را مشخص کنید
مثلاً «زمان (ثانیه)»، «فروش (میلیون تومان)»؛ بدون واحد، نمودار مبهم است.

۳. عنوان را به سؤال یا پیام نزدیک کنید
به‌جای «نمودار سهم بازار»، بنویسید «تغییر سهم بازار سه شرکت اصلی از ۲۰۱۸ تا ۲۰۲۲».

۴. از نوع نمودار مناسب استفاده کنید

جمع‌بندی

در این بخش یاد گرفتید که با matplotlib:

در تمرین‌های علم داده می‌توانید از همین الگوهای ساده استفاده کنید و کم‌کم با آزمون و خطا، نمودارهای حرفه‌ای‌تر بسازید.

Views: 6

Comments

Please login to add a comment.

Don't have an account? Register now!