Matplotlib مكتبة قوية في بايثون لإنشاء تصورات. من المهام الشائعة عرض صور متعددة ضمن رسم بياني واحد للمقارنة أو لتوضيح جوانب مختلفة من نفس البيانات. تقدم هذه المقالة طريقتين فعالتين لتحقيق ذلك: استخدام add_subplot()
بشكل متكرر وإنشاء دالة قابلة لإعادة الاستخدام.
محتويات الجدول
إنشاء رسم فرعي متكرر باستخدام add_subplot()
يُعد هذا النهج مثاليًا عندما يكون عدد الصور ديناميكيًا. add_subplot(nrows, ncols, index)
يُنشئ رسومات فرعية داخل رسم بياني، مع تحديد عدد الصفوف، والأعمدة، ومؤشر الرسم الفرعي الحالي.
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import os
image_dir = "path/to/your/images" # استبدل بمسار مجلد الصور الخاص بك
image_files = [f for f in os.listdir(image_dir) if os.path.isfile(os.path.join(image_dir, f))]
if not image_files:
print("لم يتم العثور على صور في المسار المحدد.")
else:
num_images = len(image_files)
nrows = int(num_images**0.5)
ncols = (num_images + nrows - 1) // nrows
fig, axes = plt.subplots(nrows, ncols, figsize=(15, 10))
axes = axes.ravel()
for i, image_file in enumerate(image_files):
image_path = os.path.join(image_dir, image_file)
img = mpimg.imread(image_path)
axes[i].imshow(img)
axes[i].set_title(image_file)
axes[i].axis('off')
#إزالة أي رسومات فرعية إضافية
for j in range(i + 1, len(axes)):
fig.delaxes(axes[j])
plt.tight_layout()
plt.show()
تكرر هذه الكود عبر الصور، وتقرأها باستخدام mpimg.imread()
، وتعًرضها في رسومات فرعية. plt.tight_layout()
يمنع التداخل. تذكر استبدال `”path/to/your/images”` بمسار المجلد الخاص بك. يقوم الكود بضبط الصفوف والأعمدة ديناميكيًا للحصول على تخطيط مثالي وإزالة الرسومات الفرعية الفارغة.
دالة قابلة لإعادة الاستخدام لعرض الصور
من أجل تنظيم الكود بشكل أفضل وإعادة استخدامه، قم بتغليف منطق عرض الصورة داخل دالة:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
def display_images(image_paths, titles=None, cols=3, figsize=(15, 10)):
"""يعرض صورًا متعددة في رسم بياني واحد.
Args:
image_paths: قائمة بمسارات الصور.
titles: (اختياري) قائمة بالعناوين.
cols: عدد الأعمدة في شبكة الرسم الفرعي.
figsize: حجم الرسم.
"""
num_images = len(image_paths)
rows = (num_images + cols - 1) // cols
fig, axes = plt.subplots(rows, cols, figsize=figsize)
axes = axes.ravel()
for i, image_path in enumerate(image_paths):
img = mpimg.imread(image_path)
axes[i].imshow(img)
if titles:
axes[i].set_title(titles[i])
axes[i].axis('off')
#إزالة أي رسومات فرعية إضافية
for j in range(i + 1, len(axes)):
fig.delaxes(axes[j])
plt.tight_layout()
plt.show()
# مثال على الاستخدام:
image_paths = ["path/to/image1.jpg", "path/to/image2.png", "path/to/image3.jpeg"] # استبدل بمسارات الصور الخاصة بك
titles = ["صورة 1", "صورة 2", "صورة 3"]
display_images(image_paths, titles)
تقبل هذه الدالة مسارات الصور وعناوين اختيارية، وتحسب شبكة الرسم الفرعي ديناميكيًا، وتعًرض الصور. إنها أكثر مرونة وقابلية لإعادة الاستخدام من النهج المتكرر. تذكر تثبيت Matplotlib: pip install matplotlib
.