زمانی که میخواهیم دو یا چند نمودار را در یک شکل نمایش دهیم از subplot استفاده میکنیم. این کار را با استفاده از دو روش مختلف میتوان انجام داد:
روش اول رسم زیر نمودار یا Subplot:
# importing required modules
import matplotlib.pyplot as plt
import numpy as np
# function to generate coordinates
def create_plot(ptype):
# setting the x-axis vaues
x = np.arange(-10, 10, 0.01)
# setting the y-axis values
if ptype == 'linear':
y = x
elif ptype == 'quadratic':
y = x**2
elif ptype == 'cubic':
y = x**3
elif ptype == 'quartic':
y = x**4
return(x, y)
# setting a style to use
plt.style.use('fivethirtyeight')
# create a figure
()fig = plt.figure
# define subplots and their positions in figure
plt1 = fig.add_subplot(221)
plt2 = fig.add_subplot(222)
plt3 = fig.add_subplot(223)
plt4 = fig.add_subplot(224)
# plotting points on each subplot
x, y = create_plot('linear')
plt1.plot(x, y, color ='r')
plt1.set_title('$y_1 = x$')
x, y = create_plot('quadratic')
plt2.plot(x, y, color ='b')
plt2.set_title('$y_2 = x^2$')
x, y = create_plot('cubic')
plt3.plot(x, y, color ='g')
plt3.set_title('$y_3 = x^3$')
x, y = create_plot('quartic')
plt4.plot(x, y, color ='k')
plt4.set_title('$y_4 = x^4$')
# adjusting space between subplots
fig.subplots_adjust(hspace=.5,wspace=0.5)
# function to show the plot
()plt.show
حاصل چهار زیرنمودار به شکل زیر است:
کد بالا را مرحله به مرحله بررسی میکنیم:
plt.style.use('fivethirtyeight')
شکل نمودارها با تنظیم استایلهای مختلف موجود یا دلخواه خود میتوانند تنظیم شوند.
( )fig = plt.figure
این ویژگی به عنوان یک ظرف سطح بالا برای تمامی عناصر نمودار عمل میکند. بنابراین ما یک شکلی تحت عنوان fig تعریف میکنیم که همه عناصر زیرنمودارها را در بر بگیرد. از متد add_subplot برای تعریف زیرنمودارها و تعیین مکان آنها استفاده می کنیم. قاعده کلی تعریف این تابع به صورت زیر است:
add_subplot(nrows, ncols, plot_number)
plt1 = fig.add_subplot(221)
plt2 = fig.add_subplot(222)
plt3 = fig.add_subplot(223)
plt4 = fig.add_subplot(224)
اگر یک زیر نمودار در شکلی وجود داشته باشد، میتوان شکل را در وضعیتی تصور کرد که به سطرها و ستونهایی تقسیم شده است. یعنی nrows برای سطرها و ncols برای ستونها) پارامتر plot_number بیانگر زیرنموداری است که تابع آن را فراخوانی میکند تا آن زیرنمودار را رسم کند Plot_number میتواند محدودهای از عدد یک تا ماکسیمم میان مقادیر nrows و ncols را داشته باشد. اگر مقادیر این سه پارامتر کمتر از 10 باشند، تابع subplot میتواند تنها با یک مقدار پارامتر عددی صحیح فراخوانی شود که رقم هزارگان این عدد بیانگر تعداد سطرها یا همان nrows رقم دهگان نشاندهنده تعداد ستونها یا همان ncols و رقم یکان بیانگر مقدار پارامتر plot_number است. این به این معنی است که به جای subplot(2,3,4) میتوان نوشت subplot(234) .
x, y = create_plot('linear')
plt1.plot(x, y, color ='r')
plt1.set_title('$y_1 = x$')
میخواهیم نقاط هر زیرنمودار را رسم کنیم. ابتدا محورهای x و y را با تابع create_plot و تعیین نوع بردار مورد نظر، ایجاد میکنیم. سپس نقاط روی زیرنمودار را با متد .plot رسم میکنیم. عنوان subplot را هم با متد set_title ایجاد میکنیم. با استفاده از $ در آغاز و پایان عنوان مورد نظرمان این اطمینان را حاصل میکنیم که در متن عنوان نمودار علامت underscore یا "_" به شکل اندیس یا همان subscript و علامت "^" برای توان یا همان superscript خوانده میشوند.
fig.subplots_adjust(hspace=.5,wspace=0.5)
این متد برای ایجاد فاصله میان زیرنمودارها به کارگرفته میشود. plt.show مثل همیشه این متد را برای نمایش شکل نهایی نمودار مینویسیم.
روش دوم رسم زیر نمودار یا Subplot:
# importing required modules
import matplotlib.pyplot as plt
import numpy as np
# function to generate coordinates
def create_plot(ptype):
# setting the x-axis vaues
x = np.arange(0, 5, 0.01)
# setting y-axis values
if ptype == 'sin':
# a sine wave
y = np.sin(2*np.pi*x)
elif ptype == 'exp':
# negative exponential function
y = np.exp(-x)
elif ptype == 'hybrid':
# a damped sine wave
y = (np.sin(2*np.pi*x))*(np.exp(-x))
return(x, y)
# setting a style to use
plt.style.use('ggplot')
# defining subplots and their positions
plt1 = plt.subplot2grid((11,1), (0,0), rowspan = 3, colspan = 1)
plt2 = plt.subplot2grid((11,1), (4,0), rowspan = 3, colspan = 1)
plt3 = plt.subplot2grid((11,1), (8,0), rowspan = 3, colspan = 1)
# plotting points on each subplot
x, y = create_plot('sin')
plt1.plot(x, y, label = 'sine wave', color ='b')
x, y = create_plot('exp')
plt2.plot(x, y, label = 'negative exponential', color = 'r')
x, y = create_plot('hybrid')
plt3.plot(x, y, label = 'damped sine wave', color = 'g')
# show legends of each subplot
()plt1.legend
()plt2.legend
()plt3.legend
# function to show plot
()plt.show
نمودار حاصل به شکل زیر است:
قسمت زیر از کد را ملاحظه نمایید:
plt1 = plt.subplot2grid((11,1), (0,0), rowspan = 3, colspan = 1)
plt2 = plt.subplot2grid((11,1), (4,0), rowspan = 3, colspan = 1)
plt3 = plt.subplot2grid((11,1), (8,0), rowspan = 3, colspan = 1)
Subplot2grid مشابه pyplot.subplot است اما از اندیسگذاری مبتنی بر صفر استفاده میکند و این امکان را فراهم میکند که زیرنمودار چندین خانه را اشغال کند. توضیح آرگومانهای این متد به شرح زیر است:
آرگومان اول شکل شبکه زیرنمودار را مشخص میکند. (Geometry of the grid)
آرگومان دوم محل زیرنمودار در شبکه را تعیین میکند.
آرگومان سوم تعداد سطرهای پوشیده شده با زیرنمودار است.
آرگومان چهارم تعداد ستونهای دربرگرفته توسط زیرنمودار است.
در مثال ما هر زیرنمودار سه سطر و یک ستون را با دو سطر خالی (سطرهای شماره4 و 8 ) پوشش میدهد.
توجه: پس از بررسی دو مثال بالا متوجه شدیم که از متد subplot زمانی استفاده میکنیم که اندازه نمودارها یکسان باشد و این در حالی است که متد subplot2grid انعطاف بیشتری بر روی مکان و اندازه زیرنمودارها در اختیار ما قرار میدهد.