آموزش رسم نمودار به کمک matplotlib – بخش اول

مقدمه

در این جلسه و چند جلسه آینده قصد داریم به معرفی و کار با کتابخانه matplotlib بپردازیم. از این کتابخانه برای رسم انواع نمودارها مثل هیستوگرام ، Scatter plot و … استفاده کرد. در چند جلسه و به صورت کامل به معرفی تمامی نمودارهای ممکن که میتوان با matplotlib رسم کرد ، میپردازیم. مثل همیشه بدون هیچ اتلاف وقت وارد اصل ماجرا می شویم. 

تذکر : قبل از هر چیز باید این ماژول را بر روی سیستم خود نصب کنید. ما در یک جلسه به صورت کامل در مورد نصب پکیج ها در پایتون توضیحات لازم را ارایه می دهیم ولی در این جلسه فرض میکنیم که شما این ماژول را در سیستم خود نصب داریم و وارد جزییات نصب نمی شویم. 

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

رسم نمودار با چند نقطه به کمک matplolib

فرض کنید ابتدا چند نقطه ساده داریم. مثلا نقاط (1,6) و (4,7) و (7,2) . میخواهیم با matplotlib با این نقاط یک نمودار را رسم کنیم. همانطور که میدانیم برای رسم این نمودار روی کاغذ کافی است تک تک نقاط را روی دستگاه مختصات مشخص کنیم و سپس آنها را به یکدیگر وصل کنیم. به کمک کد زیر میتوانیم این کار را با matplotlib انجام دهیم : 

import matplotlib.pyplot as plt

plt.plot([1,4,7], [6,7,2])
plt.show()

اجازه دهید تا کد بالا را با دقت بررسی کنیم. شکل زیر را ببینید : 

 matplotlib - plot

پس از اجرای این کد نتیجه به صورت زیر خواهد بود :

رسم نمودار با چند نقطه به کمک matplotlib

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

import matplotlib.pyplot as plt
x = [1,4,7]
y = [6,7,2]
plt.plot(x,y)
plt.show()

[ihc-hide-content ihc_mb_type=”show” ihc_mb_who=”2,3,4,5″ ihc_mb_template=”4″ ]

نموداری که در بالا رسم شد یک نمودار ساده است که هیچ مشخصه ای ندارد. ما میخواهیم محور x و y ما عنوان داشته باشد تا بفهمیم که نشان دهنده چه چیزی هستند. علاوه بر آن دوست داریم به خود نمودار نیز یک عنوان بدهیم تا کسی که آن را میبینید بفهمد که کلیت این نمودار مربوط به چیست. عنوان دادن به محور ها را میتوان با دستورهای xlabel و ylabel مشخص کرد. علاوه بر آن میتوانیم با کمک متد title یک عنوان برای نمودار خود نیز انتخاب کنیم. کد زیر این عنوان ها را مشخص میکند : 

import matplotlib.pyplot as plt
x = [1,4,7]
y = [6,7,2]
plt.plot(x,y)
plt.xlabel("x numbers")
plt.ylabel("y numbers")
plt.title("simple graph")
plt.show()

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

عنوان برای نمودار - matplotlib

پس از اجرای کد نتیجه به صورت زیر نمایش داده می شود :

نمودار عنوان دار - matplotlib

معمولا در یک شکل ما یک نمودار را نمی کشیم و چندین نمودار قرار داده می شود. مثل فرض کنید در شکل بالا ، علاوه بر نمودار رسم شده یک نمودار مثلا y=x نیز وجود دارد. در این حالت یکی از ابزارهای بسیار مفید استفاده از legend ها است که به کمک آن مشخص میکنیم هر نمودار که با رنگی متفاوت رسم شده است ، دقیقا کدام نمودار می باشد. اجازه دهید برای روشن تر شدن بحث ، مثالی را مطرح کنیم. فرض کنید کد زیر را داریم : 

import matplotlib.pyplot as plt
x = [1,4,7]
y = [6,7,2]
x2= [4,9,0]
y2= [9,1,6]
plt.plot(x,y)
plt.plot(x2,y2)
plt.xlabel("x numbers")
plt.ylabel("y numbers")
plt.title("simple graph")
plt.show()

ما در بالا دو نمودار را برای مجموعه داده های 1(x1, y1) و مجموعه داده های 2 (x2, y2) رسم کرده ایم. نمودار حاصل از اجرای این کد به صورت زیر می باشد: چند نمودار به کمک matplotlib

سوالی که در اینجا مطرح می شود این است که نمودار آبی مربوط به مجموعه داده های 1 است یا مجموعه داده های 2 ؟ این سوال برای نمودار قرمز نیز مشخص می شود. اینجاست که legend به کمک ما می آید. 

برای این که از legend ها استفاده کنیم باید هنگامی که از دستور plot استفاده می کنیم یک پارامتر دیگر به جز x و y را نیز اضافه کنیم. این پارامتر label نام دارد و label در واقع نام نمودار ما می باشد. پس از این کار قبل از نمایش نمودارها نیز از دستور legend استفاده کنیم تا label های مربوط به هر کدام از نمودارها به ما نشان داده شود. در واقع کد نهایی چیزی شبیه به شکل زیر می باشد:  

import matplotlib.pyplot as plt
x = [1,4,7]
y = [6,7,2]
x2= [4,9,0]
y2= [9,1,6]
plt.plot(x,y, label="for x and y")
plt.plot(x2,y2,label="for x2 and y2")
plt.xlabel("x numbers")
plt.ylabel("y numbers")
plt.title("simple graph")
plt.legend()
plt.show()

در شکل زیر توضیح مربوط به کد بالا آورده شده است. در این فقط توابع و پارامترهای جدید آورده شده است و از آوردن سایر دستوراتی که قبلا استفاده کرده ایم ، خودداری شده است :

نمایش legend ها با matplotlib

پس از اجرای این کد نتیجه به صورت زیر نشان داده می شود: 

نمودار legend دار - matplotlib

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

در ادامه سعی میکنیم نمودارهای میله ای و هیستوگرام را به کمک matplotlib رسم کنیم. قبل از هر چیز شاید بد نباشد تفاوت بین نمودارهای میله ای و هیستوگرام ها را بفهمیم. 

به صورت ساده میتوان گفت که در محور x مربوط به نمودارهای میله ای یک سری دسته بندی و در واقع Category وجود دارد در حالی که در هیستوگرام ها ما با یک سری پارامترهای عددی و محودده ی عددی روبرو هستیم. شکل زیر را ببینید :

تفاوت نمودار میله ای و هیستوگرام

حال فرض کنید میخواهیم نمودار میله ای نمره 4 دانش آموزش با نام های علی و حسین و محمدرضا و احمد را رسم کنیم. در این صورت مشابه با قبل به یک لیست نیاز داریم که محور x ها را مشخص کند که در اینجا نام 4 دانش آموزش ما است و علاوه بر آن به یک لیست نیاز داریم تا نمرات دانش آموزان را اعلام کند که فرض میکنیم نمرات آنها به ترتیب 18 و 14و 9 و 13 باشد. برای رسم نمودار میله ای مربوط به این دانش اموزان کافی است از دستور bars استفاده کنیم. کد یر این نمودار را برای ما رسم می کند:

[/ihc-hide-content]

import matplotlib.pyplot as plt
x = ["ali","hossein","mohammadreza","ahmad"]
y = [18,14,9,13]
plt.bar(x,y)
plt.xlabel("students")
plt.ylabel("scores")
plt.title("barplot example")
plt.show()

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

رسم نمودار میله ای با matplotlib

نتیجه اجرای این کد نیز به صورت زیر می باشد:

نمودار میله ای - matplotlib

حال میخواهیم یک هیستوگرام را رسم کنیم. فرض کنید که یک جمعیت 20 نفره داریم که هر فرد از این جمعیت دارای یک سن مشخص است. میخواهیم هیستوگرام سنی این جمعیت را رسم کنیم. یعنی مشخص کنیم که در بازه مثلا 10 تا 20 سال چند نفر وجود دارد. در بازه 50 تا 60 سال چند نفر وجود دارد و … 

برای این که این هیستوگرام را رسم کنیم نیاز داریم تا دو چیز را مشخص کنیم. اول این که سن افراد را تک به تک مشخص کنیم. پارامتر دوم نیز محدودهای ما است. مثلا ما میخواهیم محدود 10 تا 20 را اندازه بگیریم و … 

اجازه دهید برای درک بهتر مثال زیر را مطرح کنیم : 

import matplotlib.pyplot as plt
age = [10,20, 13, 21,4,5,67,8,90,34,54,7,22,88,77,11,98,65,23,43,54,32,34,55,90]
bin = [0,10,20,30,40,50,60,70,80,90,100]
plt.hist(age, bin,rwidth=0.8)
plt.xlabel("bins")
plt.ylabel("age")
plt.title("histogram example")
plt.show()

در زیر این کد توضیح داده شده است : هیستوگرام matplotlib

توجه کنید که به محدوده های مشخص شده روی محور x ها که ما میخواهیم دسته بندی داده های خود را طبق انها انجام دهیم bin گفته می شود. در واقع ما میخواهیم دیتاهای خود را که age ها هستند طبق bin ها دسته بندی کنیم. 

پس از اجرای این کد نتیجه خروجی به صورت زیر خواهد بود:

هیستوگرام - matplotlib

در پایان این جلسه برای درک بهتر تمرین های زیر آورده شده است که پیشنهاد می شود حتما انجام شود. 

تمارین:

 تمرین 1 : با استفاده از دستور plot نمودار y=2sin(x)+1 را برای محدوده 0.5 تا 2.5+ رسم کنید. (رنگه نمودار رسم شده حتما باید قرمز باشد.)

  •  راهنمایی : در ابتدا با دستور arange از کتابخانه numpy محدوده x را تعیین کنید و سپس y را مشخص کنید و آن را Plot کنید.
  •   تذکر : در صورت استفاده از تابع np.sinx باید توجه کنید که آرگومان ورودی این تابع به صورت پیش فرض رادیان می باشد و ما میخواهیم نمودار را بر حسب درجه رسم کنیم.

  تمرین 2 : با محدوده داده شده در بالا نمودار (y=ln(x را در کنار نمودار قبل رسم کنید و عناوین مناسبی برای محورها و نمودار انتخاب کنید. علاوه بر آن legend ها را نیز نمایش دهید.

  تمرین 3 : در نمودار مربوط به هیستوگرام در قسمت bin ها به جای عدد 20 ، عدد 70 را قرار دهید. به نظر شما باید چه اتفاقی رخ دهد ؟ کد را اجرا کنید و ببینید چه اتفاقی رخ می دهد. علت را توضیح دهید.

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

این جلسه هم به پایان رسید. مثل همیشه میتوانید ما را در تلگرام و یا اینستاگرام دنبال کنید : 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

4 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • import numpy as np
    import matplotlib.pyplot as plt
    x = np.linspace(0.5*np.pi, 2.5*np.pi)
    y=2*np.sin(x)+1
    y2=np.log(x)
    plt.plot(x,y,label=”sin”,color=”red”)
    plt.plot(x,y2,label=”ln”,color=”blue”)
    plt.legend()
    plt.show()

دیدگاهتان را بنویسید