آموزش

مقدمه‌ای بر رسم نمودار با Matplotlib در پایتون

این آموزش نشون می‌ده چطور با استفاده از Matplotlib، یکی از کتابخونه‌های قدرتمند مصورسازی داده در پایتون، نمودارهای خطی، میله‌ای و پراکندگی رو با داده‌های بازار سهام بسازی.

تاریخ انتشار:
2 شهریور 1405
پایتون
12 دقیقه
مصورسازی داده
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

در این آموزش، نحوهٔ رسم نمودارهای خطی، میله‌ای و پراکندگی در Matplotlib رو با استفاده از داده‌های بازار بورس یاد می‌گیریم. پیش‌فرض این آموزش اینه که تا حدودی با آرایه‌های NumPy و دیتافریم‌های pandas آشنا هستی. البته هر جا که از کتابخونه‌ای استفاده کنیم، کاربردش رو توضیح می‌دیم، ولی تمرکز اصلیمون در اینجا روی Matplotlib هست.

خلاصهٔ مطلب

  • کتابخونهٔ Matplotlib پایه‌ای‌ترین ابزار پایتون برای رسم نموداره. با pip install matplotlib نصبش کن و به‌صورت import matplotlib.pyplot as plt ایمپورتش کن.
  • نمودارهای خطی رو با plt.plot(x, y)، میله‌ای رو با plt.bar(x, height) و نمودارهای پراکندگی رو با plt.scatter(x, y) رسم کن.
  • همیشه plt.show() رو صدا بزن تا نمودار نمایش داده بشه، یا برای ذخیره کردنش از plt.savefig('filename.png') استفاده کن.
  • با plt.title()، plt.xlabel()، plt.ylabel() و پارامتر color نمودارت رو شخصی‌سازی کن.
  • برای داده‌های پیوسته از کالرمَپ‌ها (cmap) و برای نمودارهای چندسری از plt.legend() استفاده کن.

Matplotlib چیه؟

کتابخونهٔ Matplotlib پرکاربردترین ابزار مصورسازی داده در پایتونه که تا سال ۲۰۲۶ بیشتر از ۵۰ میلیون دانلود ماهانه داشته. با این کتابخونه می‌تونی انواع نمودارهای ثابت، تعاملی و متحرک مثل نمودارهای خطی، میله‌ای، پراکندگی، هیستوگرام و غیره رو رسم کنی. جالبه بدونی که بیشتر کتابخونه‌های دیگهٔ مصورسازی در پایتون (مثل Seaborn، ابزار رسم نمودار pandas و حتی بخش‌هایی از Plotly) بر پایهٔ Matplotlib ساخته شدن.

Matplotlib کنترل دقیقی روی هر عنصر بصری بهت می‌ده، که البته معنیش اینه که حتی برای نمودارهای ساده هم باید کد بیشتری بنویسی. اگه سرعت در رسم نمودارها برات اولویت داره، Seaborn تنظیمات پیش‌فرض سطح بالاتری داره که از همون اول ظاهر قشنگی به نمودارها می‌ده. برای نمودارهای تعاملی تحت وب هم، Plotly Express گزینهٔ خیلی خوبیه که ارزش امتحان کردن رو داره.

در پایان این آموزش، یاد می‌گیری چطور نمودارهای خطی، میله‌ای و پراکندگی (مثل نمونهٔ زیر) رو رسم کنی. همچنین با اصول شخصی‌سازی مثل انتخاب رنگ‌ها، اضافه کردن برچسب و عنوان، تنظیم بازهٔ محورها و ذخیرهٔ فایل خروجی آشنا می‌شی.

شروع کار با Matplotlib

بدون معطلی بریم سراغ لود کردن Matplotlib و یه نگاه سریع به دیتاستی که قراره در این آموزش ازش استفاده کنیم بندازیم.

لود کردن Matplotlib

قبل از رسم هر نموداری، اول باید کتابخونه رو ایمپورت کنی. زیرماژول pyplot تمام توابع رسم نموداری که در این آموزش لازم داریم رو در اختیارمون می‌ذاره.

عرف بر اینه که pyplot رو با نام مستعار plt ایمپورت کنیم. من در اینجا pandas، numpy و datetime رو هم ایمپورت می‌کنم چون در بخش‌های بعدی بهشون نیاز داریم.

بارگذاری دیتاست شاخص DJIA

کتابخونهٔ Matplotlib برای کار با آرایه‌های NumPy و دیتافریم‌های Pandas طراحی شده و رسم گراف از داده‌های جدولی رو خیلی ساده می‌کنه. در این آموزش، ما از قیمت‌های تاریخی شاخص میانگین صنعتی داو جونز (DJIA) از 2022-01-01 تا 2022-12-31 استفاده می‌کنیم (که می‌تونی اینجا پیداش کنی). می‌تونی بازهٔ تاریخی رو در صفحه تنظیم کنی و بعد روی دکمهٔ «download a spreadsheet» کلیک کنی.

ما فایل CSV به اسم HistoricalPrices.csv رو با استفاده از کتابخونهٔ pandas لود می‌کنیم و با متد .head() چند سطر اولش رو می‌بینیم.

خروجی
    Date      Open      High      Low       Close
0   12/30/22  33121.61  33152.55  32847.82  33147.25
1   12/29/22  33021.43  33293.42  33020.35  33220.80
2   12/28/22  33264.76  33379.55  32869.15  32875.71
3   12/27/22  33224.23  33387.72  33069.58  33241.56
4   12/23/22  32961.06  33226.14  32814.02  33203.93

همون‌طور که می‌بینی، داده‌ها شامل ۴ ستون هستن: Date، Open، High، Low و Close. چهار مورد آخر مربوط به قیمت شاخص در طول روز معاملاتی هستن. در ادامه توضیح مختصری دربارهٔ هر متغیر دادیم.

  • Date: روزی که اطلاعات قیمت سهام رو نشون می‌ده.
  • Open: قیمت DJIA در ساعت ۹:۳۰ صبح (به وقت شرقی) که بازار باز می‌شه.
  • High: بالاترین قیمتی که DJIA در طول اون روز بهش رسیده.
  • Low: کمترین قیمتی که DJIA در طول روز تجربه کرده.
  • Close: قیمت DJIA در ساعت ۴:۰۰ بعدازظهر (به وقت شرقی) که بازار بسته می‌شه.

به‌عنوان یه قدم سریع برای تمیز کردن داده‌ها، باید از متد rename() در Pandas استفاده کنیم، چون دیتاستی که دانلود کردیم یه فاصلهٔ اضافی در نام ستون‌هاش داره.

ما ستون Date رو هم به نوع datetime تبدیل می‌کنیم و اون رو به ترتیب صعودی بر اساس تاریخ مرتب می‌کنیم. اگه دوست داری دربارهٔ تبدیل انواع داده بیشتر بدونی، می‌تونی آموزش تبدیل انواع داده در پایتون رو بخونی.

رسم نمودارهای خطی با Matplotlib

نمودارهای خطی نشون می‌دن که چطور مقادیر در طول یه بُعد پیوسته (معمولاً زمان) تغییر می‌کنن. این نمودارها برای داده‌های سری زمانی گزینه‌های اصلی هستن، چون نقاط متصل‌به‌هم باعث می‌شن روندها، فصلی بودن و ناهنجاری‌ها رو با یه نگاه متوجه بشیم.

نمودارهای خطی تک‌خطی

با استفاده از متد plt.plot() می‌تونیم یه نمودار خطی در matplotlib رسم کنیم؛ به این صورت که آرگومان اول، متغیر محور x و آرگومان دوم، متغیر محور y در نموداره. یادت باشه هر بار که نموداری رسم می‌کنیم، حتماً باید plt.show() رو صدا بزنیم تا گراف روی صفحه نمایش داده بشه. حالا می‌خوایم قیمت بسته‌شدن شاخص DJIA رو در طول زمان مصورسازی کنیم.

می‌تونیم ببینیم که شاخص در ابتدای سال در بالاترین مقدار خودش بوده و بعد از اون در طول سال نوساناتی به سمت بالا و پایین داشته. همچنین می‌بینیم که قیمت حوالی ماه اکتبر به کمترین مقدار خودش رسیده و بعدش با یه افزایش قوی به پایان سال نزدیک شده.

نمودارهای خطی چندخطی

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

در طول سال، می‌بینیم که قیمت‌های باز و بسته‌شدن شاخص DJIA در هر روز خیلی به هم نزدیک بودن و الگوی واضحی وجود نداره که یکی همیشه بالاتر یا پایین‌تر از اون یکی باشه.

اضافه کردن راهنمای نمودار (Legend)

اگه بخوایم مشخص کنیم که هر خط مربوط به کدوم ستونه، می‌تونیم یه راهنما (legend) اضافه کنیم. این کار یه باکس راهنما در گوشهٔ گراف ایجاد می‌کنه. برای این کار کافیه پارامتر label رو به هر کدوم از توابع plt.plot() اضافه کنیم و بعدش plt.legend() رو صدا بزنیم.

حالا می‌بینیم که یه راهنما با برچسب‌هایی که مشخص کردیم در مکان پیش‌فرض (یعنی بالا سمت راست) ظاهر شده. البته می‌تونی جاش رو با استفاده از آرگومان loc در plt.legend() تغییر بدی.

رسم نمودارهای میله‌ای با Matplotlib

نمودارهای میله‌ای برای مقایسهٔ مقادیر عددی در بین دسته‌های مختلف خیلی کاربرد دارن؛ به‌خصوص وقتی که بخوایم بزرگ‌ترین و کوچک‌ترین دسته‌ها رو پیدا کنیم.

در این بخش، ما داده‌ها رو با استفاده از pandas.groupby() بر اساس میانگین‌های ماهانه تجمیع می‌کنیم تا بتونیم عملکرد ماهانهٔ DJIA رو مقایسه کنیم. اگه می‌خوای دربارهٔ عملیات گروه‌بندی بیشتر بدونی، آموزش گروه‌بندی در pandas رو ببین.

خروجی
    Month    Open             High             Low              Close
0   January  35498.1305       35740.9105       35145.955        35456.145
1   February 34687.5163157895 34906.2042105263 34362.2436842105 34648.4805263158
2   March    34007.4982608696 34270.8908695652 33752.9634782609 34029.7404347826
3   April    34392.0945       34640.3675       34078.481        34314.99
4   May      32364.3271428571 32668.0280952381 31996.5128571429 32379.4628571429
5   June     31526.0333333333 31755.6371428571 31188.7880952381 31446.7128571429

نمودارهای میله‌ای عمودی

کار رو با ساخت یه نمودار میله‌ای عمودی شروع می‌کنیم. این کار با استفاده از متد plt.bar() انجام می‌شه، که در اون آرگومان اول، متغیر محور x (Month) و پارامتر height، همون متغیر محور y (Close) هست. در آخر هم حتماً باید plt.show() رو صدا بزنیم تا نمودار نمایش داده بشه.

همون‌طور که می‌بینیم، میانگین قیمت‌های بسته‌شدن در بیشتر ماه‌ها به هم نزدیک بوده؛ اما ژوئن کمترین و ژانویه بیشترین میانگین قیمت بسته‌شدن رو داشتن.

مرتب‌سازی دوبارهٔ میله‌ها در نمودار

اگه بخوایم میله‌ها رو از بیشترین تا کمترین مقدار مرتب کنیم، می‌تونیم با استفاده از متد sort_values() در Pandas داده‌ها رو مرتب کنیم و بعد دوباره plt.bar() رو صدا بزنیم.

همون‌طور که می‌بینی، حالا خیلی راحت‌تر می‌شه تشخیص داد کدوم ماه‌ها بیشترین و کمترین میانگین قیمت رو داشتن. مقایسه و رتبه‌بندی ماه‌ها هم خیلی آسون‌تر شده.

نمودارهای میله‌ای افقی

گاهی اوقات اگه میله‌ها افقی باشن، درک نمودار و خوندن برچسب‌ها راحت‌تر می‌شه. برای رسم این نوع نمودار می‌تونیم از متد plt.barh() استفاده کنیم.

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

رسم نمودارهای پراکندگی با Matplotlib

نمودارهای پراکندگی رابطهٔ بین دو متغیر عددی رو نشون می‌دن. هر نقطه نمایندهٔ یه رکورد داده‌ست و الگوی کلی نشون می‌ده که آیا بین متغیرها رابطهٔ خطی یا غیرخطی وجود داره یا اینکه کلاً ربطی به هم ندارن. این موضوع در انتخاب مدل تحلیل داده خیلی تأثیرگذاره.

ساخت یه نمودار پراکندگی ساده

مثل نمودارهای دیگه، یه نمودار پراکندگی رو می‌شه با pyplot.scatter() رسم کرد؛ به این صورت که آرگومان اول، محور x و آرگومان دوم، محور y رو مشخص می‌کنه. در این مثال می‌خوایم رابطهٔ بین قیمت‌های باز و بسته‌شدن DJIA رو بررسی کنیم.

در محور x، قیمت بازشدن و در محور y، قیمت بسته‌شدن رو داریم. همون‌طور که انتظار می‌رفت، می‌بینیم که با افزایش قیمت بازشدن، قیمت بسته‌شدن هم افزایش پیدا می‌کنه و رابطهٔ خیلی قوی‌ای بینشون برقراره.

اضافه کردن خط روند

در قدم بعدی، یه خط روند (trend line) به گرافمون اضافه می‌کنیم تا رابطهٔ خطی بین open و close رو واضح‌تر نشون بدیم. برای این کار از متدهای polyfit() و poly1d() در کتابخونهٔ numpy کمک می‌گیریم. متد اول یه برازش چندجمله‌ای حداقل مربعات بهمون می‌ده که آرگومان اولش متغیر x، دومی متغیر y و سومی درجهٔ برازش هست (که برای خطی باید ۱ باشه). متد دوم یه کلاس چندجمله‌ای تک‌بعدی می‌سازه که می‌تونیم ازش برای رسم خط روند توسط plt.plot() استفاده کنیم.

همون‌طور که می‌بینیم، خط روند دقیقاً از بین نقاط نمودار پراکندگی عبور می‌کنه؛ چون رابطهٔ بین قیمت باز و بسته‌شدن به‌شدت خطیه. مشخصه که هرچه قیمت در شروع بازار بالاتر باشه، قیمت در پایان بازار هم با یه نرخ مشابه و خطی بالاتر می‌ره.

تنظیم عنوان و برچسب محورها

اضافه کردن عنوان و برچسب محورها به بیننده کمک می‌کنه تا دقیقاً بفهمه داره به چه داده‌ای نگاه می‌کنه. توابع plt.title()، plt.xlabel() و plt.ylabel() در Matplotlib دقیقاً برای همین کار هستن. این همون نمودار پراکندگی قبلیه که حالا این سه مورد بهش اضافه شده:

تغییر رنگ‌ها

انتخاب رنگِ مناسب تأثیر زیادی روی خوانایی و انتقال پیام نمودار داره. در Matplotlib رنگ‌ها رو به سه روش می‌تونی مشخص کنی:

  • نام رنگ‌ها: مثل "red"، "blue"، "steelblue"
  • کدهای هگز (Hex): مثل "#f4db9a"، "#383c4a"
  • تاپل‌های RGB: مثل (0.49, 0.39, 0.15)، (0.12, 0.21, 0.47)

تغییر رنگ خط

در نمودارهای خطی می‌تونی رنگ رو با پارامتر color در متد plt.plot() تغییر بدی. در ادامه می‌خوایم رنگ خط قیمت بازشدن رو به «سیاه» (black) و خط قیمت بسته‌شدن رو به «قرمز» (red) تغییر بدیم.

تغییر رنگ میله‌ها

در نمودارهای میله‌ای می‌تونی لیستی از رنگ‌ها رو به پارامتر color پاس بدی تا رنگ هر میله رو جداگانه مشخص کنی. فرض کن می‌خوایم ماه ژانویه رو هایلایت کنیم تا روی بالا بودن میانگین قیمت در این ماه تأکید کنیم. می‌تونیم به این میله یه رنگ متفاوت بدیم تا توجه‌ها رو به خودش جلب کنه.

تغییر رنگ نقاط

در نهایت، برای نمودارهای پراکندگی هم می‌تونی از پارامتر color در plt.scatter() استفاده کنی. برای اینکه داستانی شبیه به مثال بالا رو روایت کنیم، تمام نقاط ماه ژانویه رو آبی می‌کنیم و بقیه رو خاکستری نگه می‌داریم.

استفاده از کالرمَپ‌ها (Colormaps)

کالرمَپ‌ها در واقع مقیاس‌های رنگی آماده‌ای در Matplotlib هستن که مقادیر عددی رو به یه گرادیان رنگ مپ می‌کنن (مستندات رسمی). برای اطلاعات بیشتر می‌تونی آموزش کالرمپ‌های Matplotlib رو بخونی. این رنگ‌ها از نظر بصری هماهنگی خوبی دارن و بهت کمک می‌کنن تا روند افزایشی مقادیر رو بهتر نشون بدی.

در مثال زیر، با پاس دادن قیمت بسته‌شدن به پارامتر c و تنظیم cmap روی کالرمپ plasma، از این قابلیت استفاده کردیم. همون‌طور که می‌بینی، مقادیر بالاتر رنگ روشن‌تر و زردتری دارن، در حالی که مقادیر پایین‌تر به رنگ بنفش و تیره دراومدن.

تنظیم بازهٔ محورها

گاهی اوقات بهتره فقط روی یه بازهٔ خاص از مقادیر تمرکز کنیم. مثلاً، اگه شاخص DJIA الان حوالی ۳۰ هزار دلار معامله می‌شه، ممکنه فقط رفتار نمودار در همون حوالی برامون مهم باشه. با پاس دادن یه تاپل به توابع plt.xlim() و plt.ylim() می‌تونیم بازهٔ محورهای x و y رو محدود کنیم. در این تاپل، مقدار اول حد پایین و مقدار دوم حد بالا رو مشخص می‌کنه.

ذخیرهٔ نمودارها

وقتی نموداری ساختی که ازش راضی بودی، می‌تونی اون رو در قالب یه فایل ذخیره کنی. Matplotlib با استفاده از plt.savefig() از فرمت‌هایی مثل PNG، PDF، SVG و غیره پشتیبانی می‌کنه.

برای ذخیره کردن خروجی، کافیه متد plt.savefig() رو صدا بزنی و اسم فایل رو به‌عنوان آرگومان اول بهش پاس بدی. فرمت فایل از روی پسوندی که برای اسم فایل می‌نویسی (مثل png یا pdf) تشخیص داده می‌شه؛ البته می‌تونی با پارامتر format هم فرمت رو به‌صورت دستی تغییر بدی.

سخن پایانی

در این آموزش یاد گرفتیم چطور نمودارهای خطی، میله‌ای و پراکندگی رو رسم کنیم؛ که احتمالاً بیشترین استفاده رو برات خواهند داشت. با اینکه Matplotlib در مقایسه با کتابخونه‌هایی مثل Seaborn یا Plotly به کدنویسی بیشتری نیاز داره، اما در عوض بهت این امکان رو می‌ده که روی تک‌تک پیکسل‌های نمودارت کنترل داشته باشی.

برای قدم‌های بعدی، پیشنهاد می‌کنیم رسم هیستوگرام‌ها، نمودارهای دایره‌ای و کار با کالرمَپ‌ها رو تمرین کنی. اگه دنبال یه یادگیری ساختاریافته و عمیق‌تر هستی، دورهٔ مقدمه‌ای بر مصورسازی داده‌ها با Matplotlib در فینکا رو ببین. این دوره در حدود ۴ ساعت، نحوهٔ ساخت ساب‌پلات‌ها، استایل‌دهی و به‌اشتراک‌گذاری تصاویر رو کامل بهت آموزش می‌ده.

اشتراک‌گذاری
فهرست مطالب
  • خلاصهٔ مطلب
  • Matplotlib چیه؟
  • شروع کار با Matplotlib
  • رسم نمودارهای خطی با Matplotlib
  • رسم نمودارهای میله‌ای با Matplotlib
  • رسم نمودارهای پراکندگی با Matplotlib
  • تنظیم عنوان و برچسب محورها
  • تغییر رنگ‌ها
  • تنظیم بازهٔ محورها
  • ذخیرهٔ نمودارها
  • سخن پایانی

سوالات متداول

Matplotlib یه کتابخونهٔ محبوب برای مصورسازی داده‌ها در پایتونه که معمولاً برای ساخت تصاویر ثابت، تعاملی و متحرک ازش استفاده می‌شه. با Matplotlib می‌تونی فقط با چند خط کد، انواع نمودارها، هیستوگرام‌ها، نمودارهای میله‌ای، نمودارهای پراکندگی و چیزهای دیگه رو رسم کنی.

دلایل مختلفی داره. اول اینکه Matplotlib خیلی انعطاف‌پذیره؛ از انواع گراف‌ها و نمودارها پشتیبانی می‌کنه و با کتابخونه‌های دیگهٔ پایتون مثل NumPy و Pandas هم به‌خوبی هماهنگ می‌شه. دلیل دوم اینه که یه کتابخونهٔ بالغ و پرکاربرده، در نتیجه جامعهٔ کاربری بزرگی داره و منابع و آموزش‌های زیادی براش پیدا می‌شه. در نهایت، چون با پایتون نوشته شده، می‌تونی نمودارهات رو به‌عنوان بخشی از پایپ‌لاین‌های داده‌ت خودکارسازی و شخصی‌سازی کنی.

می‌تونی Matplotlib رو با استفاده از pip (پکیج‌منیجر پایتون) نصب کنی. کافیه ترمینال رو باز کنی و بنویسی: pip install matplotlib.

اینجا یه مثال ساده می‌زنیم. اول باید کتابخونهٔ Matplotlib رو ایمپورت کنی. پرکاربردترین ماژولش pyplot هست که معمولاً با نام مستعار plt ایمپورت می‌شه:

import matplotlib.pyplot as plt

بعد می‌تونی یه نمودار خطی ساده مثل این بسازی:

plt.plot([1, 2, 3, 4]) plt.ylabel('Some Numbers') plt.show()

در این مثال، از plt.plot([1, 2, 3, 4]) برای رسم لیست اعداد استفاده می‌شه. خط plt.ylabel('Some Numbers') برچسب محور y رو تنظیم می‌کنه و plt.show() هم نمودار رو نشون می‌ده.

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.