معرفی کتابخانه Matplotlib (قسمت اول)

کتابخانه Matplotlib یک کتابخانه جامع برای ایجاد تجسم های ثابت، متحرک و تعاملی در پایتون است. دلیل استفاده از این کتابخانه ایجاد محتوایی ساده تر درک بهتر توسعه دهنده یا کاربر از داده های موجود است. بدین­گونه جداول بزرگ و پیچیده را میتوان به راحتی به اشکال و نمودار های ساده تر تبدیل کرد و اطلاعات بیشتری را از آنها استخراج کرد.

چرا matplotlib را انتخاب کنیم؟

ساخت
· اطلاعات تحلیل شده خود را در چند خط، توسعه و آماده ی انتشار کنید
· به راحتی از اشکال تعاملی که قابل به روز شدن هستند استفاده کنید
شخصی سازی
· کنترل کامل سبک های خط، ویژگی های فونت، ویژگی های محورها...
· استخراج و جاسازی به تعدادی فرمت فایل و محیط های تعاملی
گسترش
· استفاده از افزونه های سازگار ارائه شده در اینترنت
· یادگیری آسان و دسترسی به مطالب آموزشی

به طور کلی میتوان گفت که این کتابخانه به دلیل راحتی و همچنین دقت به جزئیات میتواند گزینه ی مناسبی برای نمایش داده های ساختاری باشد.

امکان ایجاد مستقیم نمودار بوسیله ی دیگر کتابخانه ها مثل numpy و pandas که قبلا آموزش داده شده یکی از دلایل جذب توسعه دهندگان به این کتابخانه است که در ادامه نحوه ی ترکیب و استفاده از این کتابخانه ها را توضیح میدهیم.



نصب کتابخانه:

conda install matplotlib

در محیط conda شما میتوانید با نوشتن این خط دستور، matplotlib را دانلود و نصب نمایید:

روش استفاده از این کتابخانه به دوشکل است:

الف) استفاده از کلاس pyplot

ب) استفاده از روش شی گرایی

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

در این آموزش، از numpy و pandas نیز استفاده شده، پس حتما آنها را از قبل ایمپورت کنید. برای استفاده از نمونه های رندوم از np.random.seed(42) استفاده کنید. دلیل آن هم این است که نمونه های رندوم مورد استفاده همیشه یکسان باشند تا در صورت برخورد به یک مشکل، باز هم بتوانید آنرا بازسازی کنید. این یک مرجع فرهنگ پاپ است! در رمان علمی-تخیلی محبوب داگلاس آدامز در سال 1979، «راهنمای هیچیکر برای کهکشان»، در پایان کتاب، ابرکامپیوتر Deep Thought نشان می‌دهد که پاسخ به سؤال بزرگ «زندگی، جهان و همه چیز» 42 است.

از کجا شروع کنیم؟

import matplotlib.pyplot     as plt

ابتدا این کلاس را از کتابخانه اضافه میکنیم وبه اختصار آنرا plt می­نامیم.

برای کشیدن هر نمودار ابتدا باید با تعدادی از اصطلاحات آشنا شویم:

  • 1. (نقشه) Plot: شکل کلی نمودار رسم شده توسط کد را پلات میگویند.
  • 2.(شکل) Figure: به یک یا مجموعه ای از جنس نمودار گفته میشود.
  • 3. (محور) Ax: زیر مجموعه ی figureمیباشد.


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

x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 2, 7, 13, 2])
بهتر است آرایه از جنس نامپای باشد


خروجی کد دقیقا به این شکل است. با اضافه کردن «;» به انتهای خط میتوان کد بالای نمودار را نیز حذف کرد.

همانگونه که می­بینید درصورتی که نوع و اطلاعات مربوط به ظاهر نمودار در کد ذکر نشود، سایز، نوع نمودار و سایر جزئیات به صورت پیشفرض تعیین می­شوند.

انواع مختلف نمودار در ادامه توضیح داده می­شود.

هماگونه که توضیح داده شد، برای اینکه بتوانیم به طور دقیق یک نمودار را رسم کنیم به دو کلمه­ ی کلیدی شکل (figure) و ناحیه (axes) نیاز داریم.

fig, ax = plt.subplots()

ax.plot(x, y)

بدین منظور با تعریف جدیدی به اسم طرح فرعی (subplot) آشنا می­شویم. با این کلمه میتوان جزئیات نمودار را تعیین نمود و توسط متد plot آنرا رسم کرد که خروجی مانند قبل است.

به طور کلی شکل نهایی یک نمودار به شکل زیر است:

مثال: fig عنوان مخصوص خود را دارد، همچنین زیر مجموعه­های آن هم عنوان جداگانه دارد ولی برچسب ها فقط مخصوص زیر مجموعه است که در ادامه به طور کلی در مورد این دو کلمه توضیح میدهیم

جهت مطالعه بیشتر:

Figure (شکل):
شامل کل شکل است. این شکل تمام محورهای (ax) کوچکتر، تعدادی از آرتیست های ویژه مانند عنوان ها، راهنماهای شکل و غیره... و بوم را ردیابی می‌کند. (در مورد بوم زیاد نگران نباشید، بسیار مهم است زیرا این شی است که در واقع طراحی را انجام می دهد تا طرح شما را به دست بیاورد، اما به عنوان کاربر کم و بیش برای شما نامرئی است). یک شکل می‌تواند شامل هر تعداد محور باشد، اما معمولاً حداقل یک محور دارد.
منظور از آرتیست، شی­ای است که می داند چگونه از یک رندر برای نقاشی روی بوم استفاده کند.
Axes (محورها):
این همان چیزی است که شما به عنوان "نقشه" در نظر می گیرید، این قسمتی از شکل است که با داده های شما سر و کار دارد. یک شکل داده شده می‌تواند حاوی محورهای زیادی باشد، اما یک محئور فقط می‌تواند در یک شکل باشد. محورها شامل دو (یا سه مورد در مورد سه بعدی) Axis است (از تفاوت بین Axes و Axis آگاه باشید (Axis برابر جمع Axesاست)) که از محدودیت های داده مراقبت می کند (محدودیت های داده را می توان از طریق axes نیز کنترل کرد.Axes.set_xlim() و متدهای axes.Axes.set_ylim()). هر محور دارای یک عنوان (ست از طریق set_title())، یک x-label (ست از طریق set_xlabel()) و یک مجموعه برچسب y (از طریق set_ylabel()) است.
کلاس Axes و توابع عضو آن نقطه ورود اولیه برای کار با رابط شی گرا هستند.

انواع ورودی های مورد نیاز برای رسم نمودار:

همه ی توابع نمایش نمودار آرایه های numpyیا numpy masked array را به عنوان ورودی انتظار دارند و آرایه هایی مانند جداول داده­ی pandas الزاما سازگار با این کتابخانه نیستند و بهتر است قبل از انجام عملیات روی این دسته از اطلاعات، آنها را به آرایه های نامپای تبدیل کرد.

برای مثال داده های این دیتا فریم پانداس را تبدیل به یک آرایه کردیم که جنس آرایه از جنس numpy.ndarray است.

a = pd.DataFrame(
    np.random.rand(4, 5),
    columns = list('abcde')
  )
a_asarray = a.values


مقایسه­ ی pyplot و رابط شی گرا (OO-Interface):

همانطور که در بالا ذکر شد، اساساً دو راه برای استفاده از Matplotlib وجود دارد:

  • صریحاً شکل ها و محورها را ایجاد کرده و متدها را بر روی آنها فراخوانی کنید (سبک شی گرا (OO)).
  • برای ایجاد و مدیریت خودکار شکل ها و محورها به پای پلات تکیه و از توابع pyplot برای رسم استفاده کنید.

پس برای رابط شی گرایی به کد و خروجی آن دقت کنید:

fig, ax = plt.subplots()

    ax.plot(x, x, label='linear')

    ax.plot(x, x**2, label='quadratic')

    ax.plot(x, x**3, label='cubic')

    ax.set_xlabel('x label')

    ax.set_ylabel('y label')

    ax.set_title(&quotSimple Plot&quot)

    ax.legend()

توجه کنید که برای ساخت fig مجبور به استفاده از pyplot.figure هستیم.

سه محور با مقادیر x مشابه و yبه توان یک، دو و سه و با نام های ذکر شده ساخته و در سه خط بعدی مشخصات جانبی نمودار را وارد می­کنیم.

و Legend نشاندهنده­ی همان راهنمای نمودار است که قبلا نیز به آن اشاره کردیم. تمامی رنگ های انتخاب شده، در تم پیشفرض کتابخانه تعیین شده است.

در ادامه به روش pyplot میپردازیم:

در این روش داده ها را روی محور های ضمنی (متغیری برای آنها تعبیه نشده) قرار می­دهیم.

x = np.linspace(0, 2, 100)
 
plt.plot(x, x, label='linear')
 plt.plot(x, x**2, label='quadratic') 
 plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title(&quotSimple Plot&quot)
plt.legend()

همانگونه که مشاهده می­کنید نتیجه ی کار یکسان است بنابراین انتخاب روش در این دسته از نمودار ها آزاد است.

علاوه بر این، رویکرد سومی وجود دارد، برای موردی که Matplotlib را در یک برنامه رابط کاربری گرافیکی جاسازی می‌کند، که pyplot را به طور کامل حذف می‌کند، حتی برای ایجاد شکل. ما در اینجا در مورد آن بحث نمی کنیم.

اسناد و نمونه‌های Matplotlib از هر دو رویکرد OO و pyplot (که به یک اندازه قدرتمند هستند) استفاده می‌کنند، و شما باید با خیال راحت از هر کدام استفاده کنید (اما، ترجیحاً یکی از آنها را انتخاب کنید و به آن بچسبید، به جای مخلوط کردن آنها). به طور کلی، ما پیشنهاد می‌کنیم که pyplot را به طرح‌های تعاملی محدود کنیم (مثلاً در یک نوت بوک Jupyter)، و برای ترسیم غیرتعاملی، سبک OO را ترجیح دهیم (در توابع و اسکریپت‌هایی که قرار است به عنوان بخشی از پروژه بزرگ‌تر مورد استفاده مجدد قرار گیرند).

به دلیل اینکه اشیاء و اجزاء مورد استفاده در pyplot بدون نیاز به تعریف متغیر جدید هستند، در صورتی که بعدا به این قسمت ها نیاز پیدا شد، باید مجددا تعریف شوند.

در عوض در رابط شی گرا، وقت بیشتری برای طراحی و کد زنی صرف می­شود و برای پروژه هایی که Matplotlib زیاد مورد استفاده قرار نمیگیرند یا صرفا کوچک هستند، بهینه نیست.


ادامه مطلب را در قسمت بعدی بخوانید...

انجمن هوش مصنوعی دانشگاه اصفهان
ابولفضل شیشه­ گر
امیرمحسن براهیمی
علیرضا عشقی