<jupyter_start><jupyter_text>matplotlib احتمالا پرکاربردترین کتابخونه پایتون برای ترسیم اشکال با کیفیته. در این مطلب سعی میکنیم باهاش آشنا بشیم و یک منبع برای آموزش و ارجاع بهش تولید کنیم. اول نامپای و رابط پایتون matplotlib رو وارد محیط میکنیم:<jupyter_code>import numpy as np
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>این اسامی مستعار np و plt دیگه تقریبا استاندارد شدن و همه از این مخففها استفاده میکنن. حالا یک جادوی سلولی برای اینکه بگیم اشکال تولید شده رو داخل همین دفترچه نشون بده و در یک پنجره مجزا باز نکنه:<jupyter_code>%matplotlib inline<jupyter_output><empty_output><jupyter_text>1- رسم مقدماتی با کمک نامپای یک بازه رو به 32 قسمت مساوی تقسیم میکنیم و توابع سینوس و کسینوس رو روی اونها رسم میکنیم. اگر با numpy آشنا نیستید میتونید به این آدرس رجوع کنید. تابع plot دو تا پارامتر الزامی میگیره که اولی نقاط روی محور x و دومی نقاط متناظر روی محور y هستند:<jupyter_code>x = np.linspace(-np.pi,np.pi,32)
y1, y2 = np.sin(x), np.cos(x)
plt.plot(x,y1)
plt.plot(x,y2)
plt.title('Sin(x) and Cos(x) illustration') #عنوان نمودار
plt.xlabel('x axis')# عنوان محور افقی
plt.ylabel('y axis')# عنوان محور عمودی<jupyter_output><empty_output><jupyter_text>با توابع title و xlabel و ylabel به ترتیب عنوان کل نمودار، عنوان محور افقی و عنوان محور عمودی رو تنظیم کردیم. حالا کدوم سینوسه و کدوم کسینوس؟ اگه ریاضیمون خوب باشه میدونیم که مقدار تابع سینوس در صفر، صفره. پس آبیه احتمالا سینوسه و  اون نارنجیه کسینوس. اما برای راحتی میتونیم توضیحات رو به پلات اضافه کنیم. اول به تابع پلات یک پارامتر label اضافه میکنیم و بعد از اون تابع legend رو صدا میزنیم:<jupyter_code>plt.plot(x, y1, label = 'sin(x)')
plt.plot(x, y2, label = 'cos(x)')
plt.legend()<jupyter_output><empty_output><jupyter_text>برای شخص من در 80 درصد موارد همینقدر از matplotlib کافی بوده.  2- رسم متوسطه رنگ رو با پارامتر color در تابع پلات تغییر میدیم:<jupyter_code>plt.plot(x, y1, label = 'sin(x)', color = 'red')
plt.plot(x, y2, label = 'cos(x)', color = 'blue')
plt.legend()<jupyter_output><empty_output><jupyter_text>دو تا پارامتر دیگه در plot رو هم میتونیم تغییر بدیم. ضخامت خط رو با linewidth و مدل خط رو با linestyle:<jupyter_code>plt.plot(x, y1, label = 'sin(x)', linewidth = 1)
plt.plot(x, y2, label = 'cos(x)', linewidth = 5)
plt.legend()
plt.plot(x, y1, label = 'sin(x)', linestyle = ':')
plt.plot(x, y2, label = 'cos(x)', linestyle = '-.')
plt.legend()<jupyter_output><empty_output><jupyter_text>انواع استایل رسم خط به همراه توضیح در دیکشنری زیر اومدن:<jupyter_code>lineStyles = {'-': '_draw_solid', '--': '_draw_dashed', '-.': '_draw_dash_dot', ':': '_draw_dotted', 'None': '_draw_nothing', ' ': '_draw_nothing', '': '_draw_nothing'}<jupyter_output><empty_output><jupyter_text>با توابع xlim و ylim میتونیم به ترتیب مشخص کنیم که تابع روی چه بازه ای از محور x و y نمایش داده بشن. هر دوتای این توابع مقدار ابتدا و انتهای بازه نمایش برای محور خودشون رو در پارامترهای ورودیشون دریافت میکنن. مثلا اگر بخواهیم اون فضای خالی اول و آخر محور x رو حذف کنیم:<jupyter_code>plt.plot(x, y1)
plt.plot(x, y2)
plt.xlim(x.min(), x.max())
plt.plot(x, y1)
plt.plot(x, y2)
plt.ylim(-3, 3)<jupyter_output><empty_output><jupyter_text>برای اینکه چند نمودار رو داخل یک شکل بیاریم از تابع subplot  استفاده میکنیم. این تابع 3 تا پارامتر ورودی میگیره که دوتای اولی مشخص میکنن چند سطر و چند ستون نمودار ایجاد بشن و سومی اندیس نموداری که میخواهیم داخلش رسم کنیم رو مشخص میکنه. این اندیس از نمودار سمت چپ بالا شروع میشه و به ترتیب افزایش پیدا میکنه :<jupyter_code>plt.subplot(2,2,1)# دوسطر و دو ستون نمودار
plt.plot(x,y1, label='suplot 1')
plt.legend()
plt.subplot(2,2,2)
plt.plot(x,y2, label='suplot 2')
plt.legend()
plt.subplot(2,2,3)
plt.plot(x,y2, label='suplot 3')
plt.legend()
plt.subplot(2,2,4)
plt.plot(x,y1, label='suplot 4')
plt.legend()<jupyter_output><empty_output><jupyter_text>اگر اندازه شکل کوچیکه با پارامتر figsize دستور figure میتونیم بزرگش کنیم. حالا دو سطر و یک ستون نمودار در یک نمودار:<jupyter_code>plt.figure(figsize=(10, 10))#اندازه ها به اینچ هستند
plt.subplot(2,1,1)
plt.plot(x,y1, label='suplot 1')
plt.legend()
plt.subplot(2,1,2)
plt.plot(x,y2, label='suplot 2')
plt.legend()<jupyter_output><empty_output><jupyter_text>3- انواع دیگر نمودار matplotlib از انواع متنوعی از نمودار پشتیبانی میکنه که بعضی از اونها رو اینجا بررسی میکنیم. اگر به نمودارهای خروجی از تابع plot دقت کنیم میبینیم که این تابع نقاطی رو که ما بهش دادیم رو با یک خط به وصل کرده. اگر بخواهیم اعداد ورودی ما به صورت نقطه ای رسم بشن از تابع scatter استفاده میکنیم. این تابع زمانی که داده های محور افقی ما منظم نیست هم بدرد میخوره چون این مدل داده تابع plot رو به زحمت میندازه:<jupyter_code>x3 = 3*np.random.rand(1,32)-1.5
y3 = 2*np.random.rand(1,32)-1
plt.plot(x3,y3);
plt.scatter(x,y2, label='Cos(x)')
plt.scatter(x3,y3, label = 'random data')
plt.legend()<jupyter_output><empty_output><jupyter_text>یک پارامتر سوم اختیاری هم داره که ضخامت نقطه ها رو تنظیم میکنه:<jupyter_code>plt.scatter(x,y2, 3)
plt.scatter(x3,y3, 3)<jupyter_output><empty_output><jupyter_text>نوع نمایش هر نقطه رو میتونیم با پارامتر marker عوض کنیم:<jupyter_code>plt.scatter(x,y2, marker = 'x')
plt.scatter(x3,y3, marker = 's')<jupyter_output><empty_output><jupyter_text>انواع مارکرها به همراه توضیحاتشون برای ارجاع اینها هستند:<jupyter_code>markers = {'.': 'point', ',': 'pixel', 'o': 'circle', 'v': 'triangle_down', '^': 'triangle_up', '<': 'triangle_left', '>': 'triangle_right', '1': 'tri_down', '2': 'tri_up', '3': 'tri_left', '4': 'tri_right', '8': 'octagon', 's': 'square', 'p': 'pentagon', '*': 'star', 'h': 'hexagon1', 'H': 'hexagon2', '+': 'plus', 'x': 'x', 'D': 'diamond', 'd': 'thin_diamond', '|': 'vline', '_': 'hline', 'P': 'plus_filled', 'X': 'x_filled', 0: 'tickleft', 1: 'tickright', 2: 'tickup', 3: 'tickdown', 4: 'caretleft', 5: 'caretright', 6: 'caretup', 7: 'caretdown', 8: 'caretleftbase', 9: 'caretrightbase', 10: 'caretupbase', 11: 'caretdownbase', 'None': 'nothing', None: 'nothing', ' ': 'nothing', '': 'nothing'}<jupyter_output><empty_output><jupyter_text>دومین نمونه تابع barه که نمودار رو میله ای رسم میکنه. این تابع در پارامتر اول مکان های میله ها روی محور افقی رو میگیره و در پارامتر دوم ارتفاع میله متناظر با اون مکان رو میگیره. اینجا هم پارامتر اختیاری سوم ضخامت میله ها رو تنظیم میکنه:<jupyter_code>plt.bar(x,y1, .1)
plt.plot(x,y1,color='red')<jupyter_output><empty_output><jupyter_text>تابع آخری که بررسی میکنیم imshowه که برای نمایش یک ماتریس دوبعدی (عکس) به کار میره. رنگ هر نقطه با مقدار ماتریس در اون سطر و ستون نسبت مستقیم داره:<jupyter_code>img = np.random.rand(20,20)
plt.imshow(img)
plt.colorbar()#نمایش مقیاس رنگ<jupyter_output><empty_output><jupyter_text>این تابع توسط پارامتر cmap یک مقیاس رنگ اختیاری هم به عنوان ورودی میگیره:<jupyter_code>plt.imshow(img, cmap = 'hot')
plt.colorbar()
plt.imshow(img, cmap = 'gray')
plt.colorbar()<jupyter_output><empty_output><jupyter_text>4- نمودار پیشرفته برای بحث دقیقتر راجع به matplotlib، سلسله مراتب ترسیم در اون رو بررسی میکنیم. اولین و پایه ای ترین چیزی که ما در matplotlib ایجاد میکنیم یک شکل (Figure)ه . یک شکل با استفاده از تابع figure ایجاد میشه که ما در همین مطلب برای بزرگ کردن اندازه یک شکل از اون استفاده کرده بودیم. خیلی مواقع هم ما به این تابع رو مستقیما صدا نمیکنیم ولی توابع دیگری که استفاده کردیم، مثل plot، تابع figure رو به صورت ضمنی اجرا میکنن.  هر شکل شامل یک یا چند نموداره (Axes)، که قبلا استفاده ازتابع subplot برای ایجاد چند نمودار در یک شکل رو دیده بودیم. در اینجا هم مثل قبل اگر ما یک تابع مثل plot رو اجرا کنیم به طور ضمنی یک دستور subplot(1,1,1) اجرا میشه تا یک نمودار داخل شکل (که با استفاده ضمنی از figure درست شده) ایجاد بشه.  هر نمودار شامل یک یا چند محور (axis)، قاب نمودار (spines)، محتوای نمودار (نقطه، خط، میله و ...) و متون مختلف ه. هر محور شامل چند تیک (tick) بزرگ و ریزه و یک سری اعداد که مقیاس اون محور رو مشخص میکنن. عکس پایین مطالب گفته شده رو یک جا جمع میکنه. ما به ترتیب از بالا این سلسله مراتب رو به پایین میایم و قابلیت های مختلف matplotlib برای تغییر هر کدوم از این موارد رو بررسی میکنیم. ![مفاهیم بنیادی در matplotlib](./notebook_imgs/matplotlib_heirarchy.png) matplotlib یک مخزن برای نگهداری تمام مقادیر پیش فرضش داره که از طریق دیکشنری rcParams قابل دسترسی و تغییره. تعداد این مقادیر پیش فرض خیلی زیاده و ما هر جا لازم شد بهشون اشاره میکنیم. مثلا اگر بخواهیم رنگ پس زمینه پیش فرض عکس ها رو عوض کنیم:<jupyter_code>plt.rcParams['figure.facecolor'] = '0.75'<jupyter_output><empty_output><jupyter_text>گفتیم که پایه ای ترین شیئ قابل ایجاد در matplotlib یک figureه که با تابعی به همین اسم ایجاد میشه. شکل کلی دستور figure اینجوریه: figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=, clear=False, **kwargs) اما مهمترین پارامتر همون اولی با numه. این شماره ایه که برای هر figure منحصر بفرده، اگر با فایل ها در زبان c یا matlab یا پایتون کار کرده باشید مثل fid میمونه. اگر قبلا با دستور figure از یک عدد (مثل 195) جای num استفاده کرده باشید و دوباره تابع figure رو با همون عدد (195) صدا کنید، به جای ایجاد یک شکل جدید، همون شکلی که با پارامتر 195 ایجاد شده بود فعال میشه و از اون به بعد توابع مانند plot روی اون شکل اعمال میشن. شکلی که الان فعاله رو میتونیم با تابع gcf به دست بیاریم. حالا شکل قبلی رو خارج از صفحه دفترچه ژوپیتر و در یک پنجره جدا باز میکنیم:<jupyter_code>%matplotlib qt 
#میخواهیم که شکل ما در یک پنجره خارج از دفترچه رسم بشه
plt.rcParams['figure.facecolor'] = '0.75' #رسم با پس زمینه خاکستری
plt.figure(195) #شکل 195
plt.scatter(x,y2)
plt.rcParams['figure.facecolor'] = '1' #رنگ پس زمینه به حالت پیش فرض<jupyter_output><empty_output><jupyter_text>همونطوری که مشخصه این تابع پارامترهای دیگه ای هم میگیره که قبلا با figsize آشنا شدیم. پارامتر clear اگر مقدار True داشته باشه میتونه یک شکل از قبل ترسیم شده رو پاک کنه.<jupyter_code>plt.figure(195, clear=True) #الان شکل موجود در پنجره بیرونی پاک شده
%matplotlib inline
#دوباره نمودارها داخل دفترچه رسم بشن<jupyter_output><empty_output><jupyter_text>اگر به پارامترهای تابع figure مقدار ندیم مقادیر پیش فرض از rcParams استخراج میشن و موزد استفاده قرار میگیرن. مثلا پارامتر dpi میزان کیفیت عکس رو مشخص میکنه و اگر اون رو تعیین نکنیم، مقدارش از plt.rcParams['figure.dpi'] استخراج میشه.Axe ها حالت کلی تر از subplot هستند و با کمک اونها میتونیم یک نمودار رو هر جای شکل رسم کنیم. ![subplot در matplotlib](./notebook_imgs/matplotlib_subplot.png) ![subplot در matplotlib](./notebook_imgs/matplotlib_axes.png) دستورات رسم مثل plot یا scatter خروجیشون رو روی نمودار (Axe) فعال رسم میکنن. تابع gca نمودار (Axe) فعال داخل شکل (Figure) فعال رو برمیگردونه. وقتی ما دستور subplot رو اجرا میکنیم در  واقع داریم Axe فعال رو عوض میکنیم. حالا یه چیزی شبیه subplot با دستور axes ایجاد میکنیم ولی میخوایم اندازه نمودارها با هم برابر نباشه. تابع axes در وردی خودش یک لیست با 4 عدد میگیره که دو تا عدد اول نقطه مبدا Axe و دو تای بعدی عرض و ارتفاع شکل هستند:<jupyter_code>plt.figure(figsize=(8, 8))#ایجاد شکل
ax_scatter = plt.axes([0.1, 0.1, 0.65, 0.65]) #نمودار اول داخل شکل
ax_histy = plt.axes([0.755, 0.1, 0.345, 0.65]) #نمودار دوم داخل شکل
ax_scatter.scatter(x, y2)#رسم روی نمودار اول
ax_histy.hist(y2, bins = 10, orientation='horizontal');#رسم داخل نمودار دوم<jupyter_output><empty_output><jupyter_text>دستور آخری که برای ایجاد و تنظیم نمودارهای داخل یک شکل بررسی میکنیم دستور subplot2gridه که شاید کار باهاش از دستور axes آسونتر باشه. این دستور دو تا tuple به عنوان ورودی میگیره که اولی مشخص میکنه که چند سطر و چند ستون نمودار ایجاد بشه. دومی مشخص میکنه ما کدوم سطر و ستون مد نظرمونه. اما دو تا پارامتر دیگه به نامهای rowspan و colspan هم میتونیم بهش بدیم که تعیین میکنه اون نموداری که سطر و ستونش رو مشخص کردیم چند سطر یا چند ستون کش بیاد:<jupyter_code>fig = plt.figure()
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3) # ایجاد 3 سطر و 3 ستون نمودار، شروع از سطر 0 ستون 0 ، کش دادن نمودار به اندازه 3 ستون
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2) # شروع از سطر 1 ستون 0 ، کش دادن نمودار به اندازه 2 ستون
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2) # شروع از سطر 1 ستون 2 ، کش دادن نمودار به اندازه 2 سطر
ax4 = plt.subplot2grid((3, 3), (2, 0))# شروع از سطر 2 ستون 0 و نمودار به اندازه عادی
ax5 = plt.subplot2grid((3, 3), (2, 1))# شروع از سطر 2 ستون 1 و نمودار به اندازه عادی<jupyter_output><empty_output><jupyter_text>اگر به یک جای دلخواه نمودار بخواهیم متن اضافه کنیم میتونیم از تابع text استفاده کنیم. پارامتر اول و دوم این تابع جای متن رو به صورت درصد از عرض و ارتفاع اون نمودار میگیرن و پارامتر سوم متن برای نوشتن رو مشخص میکنه. با دو پارامتر اختیاری va و ha میشه حالت چینش (Alignment) افقی و عمودی متن رو تعیین کرد و پارامترهای اختیاری fontsize و rotation رو هم میشه برای تغییر اندازه متن و چرخش اون استفاده کرد. حالا اگر بخواهیم وسط نمودارهای مثال قبلی یک متن بنویسم اینجوری میشه:<jupyter_code>fig = plt.figure()
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.text(0.5, 0.5, "ax1 (0,0) colspan = 3", va="center", ha="center")# با این حالت چینش، مرکز متن در نقطه مشخص شده خواهد بود
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax2.text(0.5, 0.5, "ax2 (1,0) colspan = 2" ) # اگر حالت چینش را مشخص نکنیم متن از نقطه اعلام شده شروع میشود
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax3.text(0.5, 0.5, "ax3 (1,2)", ha="center", fontsize = 18) # اندازه فونت
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.text(0.5, 0.5, "ax4 (2,0)")
ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.text(0.5, 0.5, "ax5 (2,1)", va="center", ha="center", rotation = -90) #چرخش متن به درجه<jupyter_output><empty_output><jupyter_text>بعضی اوقات نیاز داریم که دو نمودار رو روی هم یا کنار هم رسم کنیم که یکی از محورهاشون با هم مشترکه ولی محدوده محور دیگشون خیلی با هم متفاوته. در این مواقع توابع twinx و twiny به کمک ما میان. مثلا دو تابع سینوسی و نمایی که محور x شون با هم مشترک باشه:<jupyter_code>plt.figure()
y4 = np.exp(x);
ax1 = plt.gca() # شکل فعال
ax2 = ax1.twinx() # شکل جدید با محور افقی مشترک
ax1.plot(x,y1, color = 'red')
ax1.set_ylabel('sin(x)', color = 'red') # متن و رنگ برچسب محور عمودی
ax1.tick_params(axis='y', labelcolor='red') # رنگ برچسب تیکهای محور عمودی
ax2.plot(x,y4, color = 'blue')
ax2.set_ylabel('exp(x)', color = 'blue')
ax2.tick_params(axis='y', labelcolor='blue')<jupyter_output><empty_output><jupyter_text>در مثال بالا از تابع set_ylabel استفاده کردیم که علاوه بر متن برچسب محور، رنگ  و البته چیزهای دیگه محور رو میتونه عوض کنه. برای تغییر رنگ بر چسب تیکهای محورهای عمودی هم از تابع tick_params استفاده کردیم. قبلا با توابع xlim و ylim که محدوده محورهای (axis) x , y رو تعیین میکردن آشنا شدیم.با استفاده از توابع xticks و  yticks میتونیم مقادیری که روی محورها نشون داده میشن رو عوض کنیم. با پارامتر rotation هم میتونیم برچسب ها رو بچرخونیم. مثلا اگر روی محور (axis) x، مقادیر pi و pi- برای ما مهم هستند:<jupyter_code>plt.plot(x, y1)
plt.plot(x, y2)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1,0,1], rotation = 90);<jupyter_output><empty_output><jupyter_text>میتونیم روی اون نقاطی که در دو تابع بالا مشخص کردیم، برچسبهای دلخواه بگذاریم. این برچسب ها از LaTeX پشتیبانی میکنن. مثلا اگر در محور x به جای 3.14 بخواهیم بنویسیم pi:<jupyter_code>plt.plot(x,y1)
plt.plot(x,y2)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])<jupyter_output><empty_output><jupyter_text>بعضی اوقات یک نقطه روی محور x یا روی محور y برای ما مهم هستند و میخواهیم اون رو مشخص کنیم. برای اینکار میتونیم یک خط عمودی یا افقی رو اون عدد مهم رسم کنیم. برای خط افقی از تابع axhline استفاده میکنیم که یک نقطه روی محور y میگیره و به موازات محور x یک خط رسم میکنه. برای خط عمودی از تابع axvline میشه استفاده کرد. هر دوی این توابع یک پارامتر color میگیرن که رنگ خط رو مشخص میکنه و یک پارامتر lw که ضخامت خط رو تنظیم میکنه:<jupyter_code>plt.plot(x,y1)
plt.plot(x,y2)
plt.axhline(0)
plt.axvline(0, color = 'red', lw =2)<jupyter_output><empty_output><jupyter_text>تا حالا تمام شکل های ما محورهای عمودی و افقی رو سمت پایین و چپ نمودار رسم میکنند. اگر بخواهیم جای رسم محورها رو جابجا کنیم یا رنگ اون رو عوض کنیم از دیکشنری spines در اون نمودار استفاده میکنیم و توابع setcolor و setposition اون شیء رو فراخوانی میکنیم:<jupyter_code>plt.plot(x,y1)
plt.plot(x,y2)
ax = plt.gca()
ax.spines['right'].set_color('none') # محور سمت راست مدرج نیست. مخفیش میکنیم
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data',0)) # محور پایین مدرج شده محور افقی است. جابجاش میکتیم
ax.spines['left'].set_position(('data',0))<jupyter_output><empty_output><jupyter_text>برای درجه بندی های (ticks) روی محورها هم میشه تنظیماتی انجام داد. با فراخوانی تابع set_major_locator روی محور نمودار میشه جای درجه ها رو جابجا کرد. مثالهایی از پارامترهایی که میشه به این تابع داد در شکل زیر اومدن:  ![locator در matplotlib](./notebook_imgs/matplotlib_locator.png) یک مورد مهم دیگه وقتیه که پارامترهای یک محور به جای عدد از جنس زمان باشن:<jupyter_code>import matplotlib.dates as mdates
from datetime import datetime
time = [
    '2019-09-01','2019-09-02','2019-09-03','2019-09-04','2019-09-05','2019-09-06','2019-09-07','2019-09-08','2019-09-09','2019-09-10',
    '2019-09-11','2019-09-12','2019-09-13','2019-09-14','2019-09-15','2019-09-16','2019-09-17','2019-09-18','2019-09-19','2019-09-20',
    '2019-09-21','2019-09-22','2019-09-23','2019-09-24','2019-09-25','2019-09-26','2019-09-27','2019-09-28','2019-09-29','2019-09-30',
    '2019-10-01','2019-10-02'
    ]
time = [datetime.strptime(d, "%Y-%m-%d") for d in time]
plt.figure(figsize=(14,6))
plt.plot(time,y1)
plt.plot(time,y2)
ax = plt.gca()
ax.get_xaxis().set_major_locator(mdates.DayLocator())
ax.get_xaxis().set_major_formatter(mdates.DateFormatter("%Y/%m/%d"))
plt.xticks(rotation=70)<jupyter_output><empty_output><jupyter_text>برای مشخص کردن و توضیح دادن روی یک نقطه نمودار از تابع annotate استفاده میکنیم. ورودیهای این تابع یک متنه (که از LaTeX هم پشتیبانی میکنه)، یک توپل به اسم xy که طول عرض نقطه ای رو که میخواهیم بهش اشاره کنیم مشخص میکنه، یک پارامتر توپل به نام xytext که طول و عرض جایی که متن نوشته میشه رو تعیین میکنه و یک دیکشنری به نام arrowprops که مشخصات اون پیکان متصل کننده متن و نقطه رو عوض میکنه:<jupyter_code>plt.plot(x,y1)
plt.plot(x,y2)
ax = plt.gca()
ax.annotate('cos(0) = 1', xy=(0, 1), xytext=(1, 1.5), arrowprops=dict(arrowstyle="->"))
ax.set_ylim(-2, 2)<jupyter_output><empty_output><jupyter_text>5- ذخیره نمودار در فایل با استفاده از تابع savefig میتونیم نمودارها رو ذخیره کنیم.این دستور از فرمتهای bmp, jpg, svg, pdf, png و ... پشتیبانی میکنه. پارامترهای عکس مثل انداره ، dpi و ... همونهایی هستن که با استفاده از تابع figure تنظیم شدن:<jupyter_code>plt.bar(x,y1, .1)
plt.plot(x,y1,color='red')
plt.savefig('hist.png')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11372484509513626, 'fraction_numerical': 0.03432582113286176, 'mean_word_length': 4.9601307189542485, 'pattern_counts': {'":': 0, '<': 126, '<?xml version=': 0, '>': 127, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '31', 'dir': 'jupyter-structured-clean-dedup', 'id': '619307', 'license': 'MIT', 'n_tokens_mistral': 13455, 'n_tokens_neox': 10988, 'n_words': 2529, 'path': 'matplotlib_tutorial.ipynb', 'repo_name': 'moquantum/BasicDataScience_FA', 'size': '18237'}