পাইথন প্রোগ্রামিং ০৬: Matplotlib

 

Pyplot

pyplot হল Matplotlib লাইব্রেরির একটি সাবমডিউল যা সহজ কোডে MATLAB-এর মতো ইন্টারফেস প্রদান করে। অর্থাৎ pyplot ব্যবহার করে মাত্র কয়েকটি কমান্ডে আকর্ষণীয় ভিজ্যুয়ালাইজেশন তৈরি করা যায়। Matplotlib এ সাধারণত import matplotlib.pyplot as plt এইভাবে pyplot অংশটি আমদানি করা হয়। এরপর plt.plot() বা অন্যান্য ফাংশন কল করলে একটি স্টেট-ভিত্তিক গ্রাফ তৈরি হয়, যেখানে প্রতিটি কমান্ড বর্তমান ফিগার ও অক্ষ (axes) এর উপর কাজ করে। উদাহরণস্বরূপ, নিচের কোডে সহজে একটি সরল রেখাচিত্র (লাইন চার্ট) আঁকা হয়েছে:

python

import matplotlib.pyplot as plt
import numpy as np
# x এবং y-এর মান
x = np.array([0, 6])
y = np.array([0, 250])
plt.plot(x, y)
plt.show()


উপরের উদাহরণ কোডটি চালানোর পর একটি সরল রৈখিক গ্রাফ তৈরি হবে, যেখানে x-অক্ষের মান ০ থেকে ৬ পর্যন্ত এবং y-অক্ষের মান ০ থেকে ২৫০ পর্যন্ত দেখানো হয়েছে। এই গ্রাফে একটি সোজা রেখা আঁকা আছে যা এই বিন্দুগুলোকে সংযুক্ত করেছে।


Plotting

Matplotlib এ plotting বলতে ডেটা পয়েন্টগুলো আঁকা এবং প্রেজেন্ট করার পদ্ধতিকে বোঝায়। সাধারণত plt.plot(x, y) ফাংশন দিয়ে x এবং y অ্যারের মান দিয়ে একটি রেখাচিত্র আঁকা হয়। ডিফল্টভাবে plot() ফাংশন পয়েন্টগুলোকে রেখা দিয়ে সংযুক্ত করে। অর্থাৎ, উপরের উদাহরণে আমরা [১,৩] এবং [৮,১০] পয়েন্ট দিয়েছি, তাই plot() এই দুই পয়েন্টকে রেখা দিয়ে যুক্ত করেছে। নিচের উদাহরণে কিভাবে plot() কাজ করে তা দেখানো হলো:

python

import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([1, 8])
ypoints = np.array([3, 10])
plt.plot(xpoints, ypoints)
plt.show()
এই উদাহরণ কোডটি চালানোর পর একটি সরল লাইন গ্রাফ পাওয়া যাবে। ছবিতে দেখা যাচ্ছে (1,3) এবং (8,10) বিন্দু দিয়ে একটি ব্লু (নীল) রেখা আঁকা হয়েছে। এখানে অনুভূমিক অক্ষ (x-অক্ষ) ১ থেকে ৮ পর্যন্ত এবং উল্লম্ব অক্ষ (y-অক্ষ) ৩ থেকে ১০ পর্যন্ত বাড়ছে।

Markers

Plot-এ মার্কার ব্যবহার করে প্রতিটি ডেটা পয়েন্টকে ভিজ্যুয়ালভাবে তুলে ধরা যায়। Matplotlib এর marker আর্গুমেন্ট দিয়ে প্রতিটি পয়েন্টে একটি নিদিষ্ট চিহ্ন (যেমন বৃত্ত, তারা ইত্যাদি) যোগ করা হয়। উদাহরণস্বরূপ, নিচের কোডে প্রতিটি পয়েন্টে বৃত্তাকার মার্কার ‘o’ ব্যবহার করা হয়েছে:

python

import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([3, 8, 1, 10])
plt.plot(ypoints, marker='o')
plt.show()


এই কোডের আউটপুটে প্রতি ডেটা পয়েন্টে একটি ছোট বৃত্ত দেখা যাচ্ছে। ছবিতে একটি লাইন গ্রাফ রয়েছে এবং চারটি বিন্দুতে নীল রঙের বৃত্তাকার মার্কার রয়েছে। মার্কার ব্যবহারে গ্রাফটি আরো পরিষ্কার ভাবে বোঝা যায় যে প্রত্যেক বিন্দুতে ডেটার মান কী ছিল।

Line (লাইন)

লাইন সম্পর্কিত বৈশিষ্ট্য দিয়ে গ্রাফের রেখার ধরন ও রঙ ইত্যাদি পরিবর্তন করা যায়। উদাহরণস্বরূপ, linestyle (বা ls) আর্গুমেন্ট দিয়ে রেখার ধরন পরিবর্তন করা যায় – যেমন দাগানো, বিন্দু-বিন্দু ইত্যাদি। এছাড়া color দিয়ে লাইন রঙ এবং linewidth দিয়ে রেখার পুরুত্ব নির্ধারণ করা যায়। নিচের কোডে আমরা দাগানো (dotted) লাইন ব্যবহার করেছি:

python

import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([3, 8, 1, 10])
plt.plot(ypoints, linestyle='dotted')
plt.show()


এই কোডের ফলাফল লালিত রেখাচিত্রে বিন্দুযুক্ত দাগানো রেখার মত দেখাচ্ছে। ছবি থেকে বোঝা যাচ্ছে প্রতিটি ডেটা পয়েন্ট এখন ছোট ডট দিয়ে যুক্ত হয়েছে। এর ফলে রেখাটি পূর্ণ লাল দাগের মাধ্যমে ড্র হয়। স্টাইল সংক্ষিপ্তভাবে ':', '--' ইত্যাদি লিখেও সেট করা যায়।

Labels (লেবেল)

অক্ষ এবং গ্রাফের শিরোনাম যুক্ত করার জন্য xlabel(), ylabel(), title() ফাংশন ব্যবহার করা হয়। xlabel("লেখা") দিয়ে x-অক্ষের লেবেল, ylabel("লেখা") দিয়ে y-অক্ষের লেবেল ও title("শিরোনাম") দিয়ে গ্রাফের শিরোনাম সেট করা যায়। নিচের উদাহরণে চার্টের জন্য শিরোনাম এবং অক্ষের লেবেল যোগ করা হয়েছে:

python

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 3, 4)
y = np.array([10, 20, 25, 30])
plt.plot(x, y)
plt.title("Sample Plot")
plt.xlabel("X-axis Label")
plt.ylabel("Y-axis Label")
plt.show()


কোডটি চালানোর পর চার্টে শিরোনাম এবং অক্ষের লেবেল দেখা যাবে। ছবিতে উপরের দিকে “Sample Plot” শিরোনাম এবং নিচে যথাক্রমে “X-axis Label” ও “Y-axis Label” লেখা রয়েছে। এটি ডেটার দিকনির্দেশনা বুঝতে সাহায্য করে।

Grid (গ্রিড)

গ্রাফে গ্রিড লাইন যোগ করে ডেটার মান বোঝা সহজ হয়। Matplotlib এ plt.grid(True) লিখলে ডিফল্ট গ্রিড লাইন দেখা যায়। axis='x' বা axis='y' দিয়ে শুধু নির্দিষ্ট অক্ষে গ্রিড দেখানো যায়। নিচের উদাহরণে পুরো গ্রাফ জুড়ে গ্রিড লাইন যোগ করা হয়েছে:

python

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(80, 125, 10)
y = np.linspace(240, 330, 10)
plt.plot(x, y)
plt.title("Sports Watch Data")
plt.xlabel("Average Pulse")
plt.ylabel("Calorie Burnage")
plt.grid(True)
plt.show()


কোডটি চালানোর পর আউটপুটে একটি লাইন গ্রাফ দেখা যাচ্ছে এবং তার পেছনে সবগুলো অক্ষের উপর গ্রিড লাইন রয়েছে। ছবিতে প্রত্যেকটি বিন্দুতে আনুমানিক অবস্থান বুঝতে সেই গ্রিড লাইন সাহায্য করছে। Matplotlib এ গ্রিডের রঙ, শৈলী ও পুরুত্বও পরিবর্তন করা যায়, তবে ডিফল্টভাবেই হালকা ধূসর রঙের রেখা দেখা যায়।

Subplot (সাবপ্লট)

একই ফিগারে একাধিক প্লট প্রদর্শনের জন্য plt.subplot() ফাংশন ব্যবহার করা হয়। এটিতে তিনটি আর্গুমেন্ট থাকে: প্রথমটি সারির সংখ্যা, দ্বিতীয়টি কলামের সংখ্যা এবং তৃতীয়টি বর্তমান সাবপ্লটের ইন্ডেক্স (মিনিট নং)। উদাহরণস্বরূপ, নিচের কোডে একটি সারি ও দুটি কলাম সহ দুটি সাবপ্লট তৈরি করা হয়েছে:

python

import matplotlib.pyplot as plt
import numpy as np
# প্রথম প্লট
x = np.array([0, 1, 2, 3])
y = np.array([3, 8, 1, 10])
plt.subplot(1, 2, 1)
plt.plot(x, y)
# দ্বিতীয় প্লট
x = np.array([0, 1, 2, 3])
y = np.array([10, 20, 30, 40])
plt.subplot(1, 2, 2)
plt.plot(x, y)
plt.show()


এই উদাহরণে দুটি সাইড-বাই-সাইড চার্ট দেখা যাচ্ছে। প্রথম সাবপ্লটে (বামে) একটি চালচিত্র এবং দ্বিতীয় সাবপ্লটে (ডানে) একটি ভিন্ন চালচিত্র আঁকা হয়েছে। subplot(1,2,1) মানে ১টি সারি, ২টি কলাম, প্রথম প্লট; আর subplot(1,2,2) মানে ১টি সারি, ২টি কলাম, দ্বিতীয় প্লট। একইভাবে ভিন্ন লেআউটে একাধিক প্লট তৈরি করা যায়।

Scatter (স্ক্যাটার)

plt.scatter(x, y) ফাংশন দিয়ে স্ক্যাটার প্লট তৈরি করা হয়, যা দুটি চলকের মধ্যে সম্পর্ক দেখানোর জন্য ব্যবহৃত হয়। প্রতিটি ডেটা পয়েন্ট একটি বিন্দু হিসেবে আঁকা হয়। নিচের উদাহরণে অ্যালগরিদমের কোন গাড়ির বয়স ও গতির ডেটা দিয়ে স্ক্যাটার প্লট তৈরি করা হয়েছে:

python

import numpy as np
import matplotlib.pyplot as plt
x = np.array([5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6])
y = np.array([99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86])
plt.scatter(x, y)
plt.show()


কোডটি চালানোর পর প্রতি গাড়ির বয়স (x-অক্ষে) এবং গতি (y-অক্ষে) নিয়ে একটি স্ক্যাটার প্লট পাওয়া যাবে। ছবিতে নীল বিন্দুগুলো গাড়ির অবস্থান এবং গতির প্রতিটি পরিমাপকে দেখাচ্ছে। যেহেতু স্ক্যাটারে প্রতিটি বিন্দু স্বাধীনভাবে প্লট হয়, তাই একটি ছড়িয়ে থাকা বিন্দুসমষ্টি দেখা যাচ্ছে যা দিয়ে সহজেই বুঝতে পারা যায় গাড়িগুলোর বয়স ও গতির মধ্যে কোনো সম্পর্ক আছে কিনা।

Bars (বার চার্ট)

plt.bar(x, y) ফাংশন দিয়ে ক্যাটেগরিক ডেটা দেখানোর জন্য বার চার্ট আঁকা হয়। এতে আয়তাকার বারগুলো ব্যবহার করে বিভিন্ন ক্যাটেগরির মান তুলনা করা যায়। প্রতিটি বারের উচ্চতা বা দৈর্ঘ্য ঐ ক্যাটেগরির মানের সমান। উদাহরণস্বরূপ, নিচের কোডে চারটি ক্যাটেগরির ডেটা দেখানো হয়েছে:

python

import matplotlib.pyplot as plt
import numpy as np
x = np.array(["A", "B", "C", "D"])
y = np.array([3, 8, 1, 10])
plt.bar(x, y)
plt.show()


এই কোডে ‘A’, ‘B’, ‘C’, ‘D’ নামক চারটি ক্যাটেগরির জন্য বার চার্ট তৈরি হয়েছে। ছবিতে দেখা যাচ্ছে প্রত্যেক ক্যাটেগরির জন্য আলাদা আলাদা নীল রঙের বার আছে যার উচ্চতা সেই ক্যাটেগরির মান (৩, ৮, ১, ১০) নির্দেশ করছে। বার চার্টে সহজে তুলনা করা যায় কোন ক্যাটেগরির মান সবচেয়ে বেশি বা কম।

Histograms (হিস্টোগ্রাম)

plt.hist(data) ফাংশন দিয়ে হিস্টোগ্রাম তৈরি করা হয়, যা ডেটার বণ্টন (distribution) দেখায়। হিস্টোগ্রামে x-অক্ষকে ছোট ছোট ইন্টারভ্যাল বা বিনে ভাগ করে প্রতিটি বিনে পড়ে কয়টি ডেটা পয়েন্ট আছে তা দেখানো হয়। উদাহরণস্বরূপ, নিচে আমরা একটি নরমাল বণ্টন (জন্মগত বন্টন) থেকে ২৫০টি নমুনা নিয়ে হিস্টোগ্রাম আঁকছি:

python

import matplotlib.pyplot as plt
import numpy as np
x = np.random.normal(170, 10, 250)
plt.hist(x)
plt.show()


এই কোড চালানোর পর একটি হিস্টোগ্রাম পাওয়া যাবে। ছবিতে অনুভূমিক অক্ষে উচ্চতার পরিসর (ব্যাচ) এবং উল্লম্ব অক্ষে ঐ পরিসরে কতজনের উচ্চতা পড়েছে তা দেখানো হয়েছে। উদাহরণে দেখা যাচ্ছে প্রায় ১৬৫-১৭৫ সেমি মধ্যে অনেক মানুষ (সর্বোচ্চ প্রায় ৫০ জন) পড়েছে। হিস্টোগ্রাম ডেটার কেন্দ্রীয় প্রবণতা এবং বিস্তার বোঝাতে সাহায্য করে।

Pie Charts (পাই চার্ট)

plt.pie(sizes, labels=...) ফাংশন দিয়ে পাই চার্ট তৈরি করা হয়, যা একটি সার্কুলার চার্ট যেখানে প্রতিটি অংশ (স্লাইস) বিভিন্ন ক্যাটেগরি এবং স্লাইসের আয়তন ঐ ক্যাটেগরির মানের অনুপাতে থাকে। নীচের উদাহরণে চার ধরনের ফলের বিক্রয় দেখানোর জন্য পাই চার্ট ব্যবহার করা হয়েছে:

python

import matplotlib.pyplot as plt
import numpy as np
y = np.array([35, 25, 25, 15])
labels = ["Apples", "Bananas", "Cherries", "Dates"]
plt.pie(y, labels=labels)
plt.show()


এই কোডের আউটপুটে চারটি টুকরো পাই চার্ট দেখা যাচ্ছে, যেখানে প্রতিটি স্লাইস “Apples”, “Bananas”, “Cherries”, “Dates” ক্যাটেগরির বিক্রয় অনুপাতে রয়েছে। ছবিতে দেখা যাচ্ছে আপেলের অংশ সবচেয়ে বড় (৩৫%), চেরির অংশ পরের (২৫%), ইত্যাদি। পাই চার্ট ভিজ্যুয়ালভাবে ডেটার শতকরা অনুপাত বুঝতে সাহায্য করে। এখানে প্রতিটি “Apples” থেকে “Dates” পর্যন্ত অংশের আকার সেই ক্যাটেগরির পরিমাণের সঙ্গে সামঞ্জস্যপূর্ণ।


মন্তব্যসমূহ