فهرست بستن

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

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

بسم الله الرحمن الرحیم

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

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

x = np.arange(0, 20, 0.05)
for T in np.arange(1, 6, 1):
    y = np.exp(-x / T)
    plt.plot(x, y)

plt.show()

خروجی این کد به شکل زیر می باشد:

خروجی اول

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

plt.grid(True)
plt.show()

بعد از این کار، کار دیگری که ضروری است، احتمالا بر چسب گذاری محورهای افقی و عمودی می باشد. برای این کار از دستورات زیر استفاده می کنیم:

plt.xlabel("x")
plt.ylabel(r"$y = e^{-\frac{x}{T}}$")

نکته جالب امکان فرمول نویسی لاتک در برچسب گذاری و نوشتن متنها در matplotlib است. همانطور که می بینید برای برچسب محور عمودی فرمول زیر استفاده شده است:

y=e^{-\frac{x}{T}}

کار بعدی اضافه کردن عنوان نمودار می باشد که به سادگی آب خوردن است:

plt.title("Time constant")

تا به اینجا نمودار ما به این شکل در آمده است:

خروجی دومهنوز کار ما به مرحله قابل قبول بودن نرسیده است! یک چیزی کم دارد! مشخص کردن پارامتر T برای هر یک از نمودارها با استفاده از legend کار ما را کامل‌تر می کند. برای این کار هر بار داخل حلقه که تابع نمایی را رسم می نماییم برای رسم برچسبی تعیین می کنیم. در انتها وقتی تابع legend از plt را فراخوانی کردیم، بر چسب ها ظاهر می شوند. بیایید کدهای جدید را با اضافه کردن legend ببینیم.

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

x = np.arange(0, 20, 0.05)
for T in np.arange(1, 6, 1):
    y = np.exp(-x / T)
    plt.plot(x, y, label="T="+str(T))

plt.grid(True)
plt.xlabel("x")
plt.ylabel(r"$y = e^{-\frac{x}{T}}$")
plt.title("Time constant")
plt.legend()
plt.show()

خروجی حالا به این شکل در آمده است:

خروجی سومحالا میشه گفت یک نمودار کامل داریم. ولی موضوعی من رو اذیت میکنه! چرا محور افقی ۲٫۵ تا ۲٫۵ تا برچسب زده شده؟! من اون رو با کد زیر به دو تا دو تا تغییر می دهم:

plt.xticks([2 * i for i in range(11)])

و خروجی به شکل زیر خواهد بود:

خروجی چهارمهمه چیز عالیه ولی یک مورد سلیقه ای وجود داره. شاید یکی بخواد نمودار از x ها و y های کوچکتر از صفر نشون داده نشه. نمودار بالا صفحه ای رو نشون می ده که از مقدار x و y کوچکتر از صفر شروع شده و ما با این کد اون رو به صفر محدود می کنیم:

plt.xlim(xmin=0)
plt.ylim(ymin=0)

و خروجی به این شکل در می آید:

خروجی پنجمچی؟ رنگ نمودارها؟ تغییرشون بدیم؟ خب باید رنگ رو خودمون مشخص کنیم، کد زیر رو ببینید:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

x = np.arange(0, 20, 0.05)
for T, color in zip(np.arange(1, 6, 1), ["red", "blue", "yellow", "cyan", "black"]):
    y = np.exp(-x / T)
    plt.plot(x, y, label="T="+str(T), c=color)

plt.grid(True)
plt.xlabel("x")
plt.ylabel(r"$y = e^{-\frac{x}{T}}$")
plt.title("Time constant")
plt.legend()
plt.xticks([2 * i for i in range(11)])
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.show()

که خروجی به شکل زیر میشه:

خروجی ششمبله منم می دونم خیلی زشت و بی ریخت شده! در نهایت اشاره کردن به یک نقطه از نمودار و نوشتن متن رو هم ببینیم. کد زیر رو در نظر بگیرید:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

x = np.arange(0, 20, 0.05)
for T in np.arange(1, 6, 1):
    y = np.exp(-x / T)
    plt.plot(x, y, label="T="+str(T))

plt.scatter(x[100], y[100], color="black")
plt.plot([0, x[100]], [y[100], y[100]], linestyle="--", color="black")
plt.plot([x[100], x[100]], [0, y[100]], linestyle="--", color="black")
plt.annotate(r"$e^{-\frac{" + str(x[100]) + "}{T=5}} = " + str(round(y[100], 4)) + "$", 
             xy=(x[100], y[100]), xytext=(+80, +0), annotation_clip=False, 
             textcoords="offset points", fontsize=16, 
             arrowprops=dict(arrowstyle="<-", connectionstyle="arc3,rad=.5"))

plt.grid(True)
plt.xlabel("x")
plt.ylabel(r"$y = e^{-\frac{x}{T}}$")
plt.title("Time constant")
plt.legend()
plt.xticks([2 * i for i in range(11)])
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.show()

هدف اصلی در کد بالا مشخص کردن نقطه x[100] و y[100] در نمودار و نوشتن رابطه محاسبه و مقدار تابع در آن نقطه است. برای این کار ابتدا یک نقطه در محل مذکور scatter نموده ایم بعد از آن با plot کردن، دو خط عمودی و افقی که محورها را به نقطه مورد نظر وصل می کنند، کشیده ایم. (همان طور که مشهود است رسم با plot را با خطچین انجام داده ایم.) در نهایت با دستور annotate فلشی از نقطه گرفته و به برچسبی که تعیین می کنیم می کشیم. خروجی کد بالا به شکل زیر می باشد:

خروجی هفتمفکر کنم دیگه کارمون تموم شد.