Table of Contents
مقدمهای کوتاه بر مصورسازی با 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() # نمایش نمودارنکتهها:
- اگر در محیطهایی مثل Jupyter Notebook هستید، معمولاً فقط نوشتن
plt.plot(...)کافی است، ولیplt.show()عادت خوبی است. - طول
xوyباید یکی باشد.
برچسبگذاری و عنوان نمودار
نمودار بدون توضیح، برای خواننده مبهم است. با چند تابع ساده میتوانیم آن را قابل فهم کنیم:
plt.title()→ عنوان نمودارplt.xlabel()→ برچسب محور افقیplt.ylabel()→ برچسب محور عمودیplt.grid()→ نمایش شبکه (grid) پسزمینه
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 میتواند شکل ظاهری نمودار را تغییر دهد:
- رنگ (color)
- نوع خط (line style)
- نوع علامت نقاط (marker)
چند روش استفاده:
روش کوتاه (یک رشتهٔ ترکیبی)
الگوی کلی:
'markerlinestylecolor'مثال:
'ro-'→ دایرههای قرمز با خط پیوسته'g--'→ خط سبزِ خطچین'b^:'→ مثلث آبی با خط نقطهچین
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()چند گزینهٔ پرکاربرد:
- رنگها:
'r','g','b','k'، یا نام کامل مثل'red','blue' - linestyle:
'-'→ خط پیوسته'--'→ خطچین':'→ نقطهچین'-.'→ ترکیبی- marker:
'o'→ دایره'^'→ مثلث رو به بالا's'→ مربع'.'→ نقطه
رسم چند نمودار در یک شکل
گاهی میخواهید چند سری داده را روی یک محور رسم کنید؛ کافی است چند بار 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 تنظیم کرد، مثلاً:
plt.legend(loc='upper left')plt.legend(loc='lower right')
نمودار ستونی (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 را تنظیم کنید:
plt.xlim(min_x, max_x)plt.ylim(min_y, max_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()نکتهها:
- فرمت فایل از پسوند مشخص میشود:
"my_plot.png","my_plot.jpg","my_plot.pdf" - اگر قبل از
plt.show()فایل را ذخیره کنید، مطمئنتر است؛ چون در برخی محیطها بعد از show نمودار خالی میشود. - میتوانید دقت (رزولوشن) را با
dpiزیاد کنید:
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()نکات:
axesدر مثال بالا یک لیست از محورهاست (چونnrows=1, ncols=2).- بهجای
plt.title()ازaxes[i].set_title()استفاده میکنیم، چون هر نمودار محور جدا دارد. tight_layout()کمک میکند عنوانها و برچسبها روی هم نیفتند.
کار با دادههای جدولی (ترکیب با 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:
- نمودار خطی، ستونی، پراکندگی و هیستوگرام رسم کنید،
- عنوان، برچسب محورها، شبکه و legend اضافه کنید،
- ظاهر نمودار (رنگ، خط، marker) را عوض کنید،
- چند نمودار را روی هم یا در قالب subplots نشان دهید،
- نمودار را بهصورت فایل تصویری ذخیره کنید.
در تمرینهای علم داده میتوانید از همین الگوهای ساده استفاده کنید و کمکم با آزمون و خطا، نمودارهای حرفهایتر بسازید.