بنية Figure وAxes
افهم التسلسل الهرمي Figure-Axes-Artist، وأنشئ المخططات باستخدام plt.subplots()، وميّز بين واجهتي API عديمة الحالة والموجهة للكائنات.
بنية Figure وAxes درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
لماذا نتعلم بنية Matplotlib؟
يستخدم كل من Pandas وSeaborn مكتبة Matplotlib داخليًا. ويتيح لكم فهم التسلسل الهرمي للكائنات في Matplotlib التحكم في كل جانب من جوانب المخطط — بدءًا من اللوحة الإجمالية ووصولًا إلى علامات التدريج الفردية — كما يتيح لكم دمج عدة مخططات في شكل واحد. ومن دون فهم نموذج Figure-Axes، يصبح تخصيص المخططات سريعًا تمرينًا محبطًا قائمًا على التخمين لمعرفة الدالة التي ينبغي استدعاؤها.
Figure: اللوحة
يمثل Figure الحاوية الخارجية؛ أي النافذة بأكملها أو ملف الصورة بالكامل. وهو يحتوي على كائن Axes واحد أو أكثر (مناطق المخطط الفعلية)، بالإضافة إلى عنوان، ووسائل إيضاح مشتركة، ومساحات فارغة. تنشئون Figure باستخدام plt.figure() أو ضمنيًا عبر plt.subplots(). وتؤثر معظم الخصائص المعينة في Figure في اللوحة بأكملها، مثل الحجم ولون الخلفية والعنوان العام.
import matplotlib.pyplot as plt
import numpy as np
# Create a Figure with a specific size
fig = plt.figure(figsize=(8, 4)) # width=8 inches, height=4 inches
print(type(fig)) # matplotlib.figure.Figure
print('Figure size:', fig.get_size_inches())
plt.close() # close to avoid display in scriptsAxes: حيث يحدث الرسم
كائن Axes هو منطقة مخطط واحدة داخل Figure. ويحتوي على المحور السيني والمحور الصادي وعلامات التدريج وخطوط الشبكة وجميع العناصر المرئية (الخطوط والأعمدة ونقاط التبعثر). وتكون معظم استدعاءات الرسم طرائق في كائن Axes، مثل ax.plot() وax.bar() وax.scatter(). ويمكن أن يحتوي Figure واحد على عدة كائنات Axes مرتبة في شبكة من المخططات الفرعية.
fig, ax = plt.subplots() # Creates Figure + one Axes
print(type(ax)) # matplotlib.axes.Axes
x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x)) # plot on the Axes
plt.tight_layout()
# plt.show()
plt.close()plt.subplots(): إنشاء Figure وAxes معًا
تُعد plt.subplots(nrows, ncols) الطريقة الموصى بها لإنشاء Figure يحتوي على Axes واحد أو أكثر ضمن تخطيط شبكي. وتعيد صفًا من (fig, ax) (أو (fig, axes_array) عند استخدام عدة مخططات فرعية). ويحدد المعامل figsize الحجم الإجمالي للوحة بالبوصة. احرصوا دائمًا على فك الصف إلى متغيرات مسماة لتوضيح الكود.
# Single plot
fig, ax = plt.subplots(figsize=(6, 4))
# 2 rows, 1 column
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 8))
# 2 rows, 2 columns
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
ax_top_left = axes[0, 0]
ax_top_right = axes[0, 1]
print('axes shape:', axes.shape) # (2, 2)
plt.close('all')واجهة برمجة التطبيقات الكائنية مقابل المعتمدة على الحالة
تحتوي Matplotlib على أسلوبي استخدام. تستخدم واجهة pyplot المعتمدة على الحالة (stateful) الدوال plt.plot() وplt.xlabel() وغيرهما، وتعمل على المحاور «الحالية»، ما يجعلها مناسبة للاستكشاف التفاعلي السريع. أما واجهة برمجة التطبيقات الكائنية (OO) فتستدعي الطرائق صراحةً على كائنات ax، مثل ax.plot() وax.set_xlabel(). ويُفضّل استخدام واجهة OO بشدة في كود الإنتاج والأشكال متعددة اللوحات، لأنها توضح المحاور التي يجري تعديلها دون لبس.
x = [1, 2, 3, 4]
y = [1, 4, 9, 16]
# Stateful API (convenient but fragile)
# plt.plot(x, y)
# plt.xlabel('x')
# plt.title('Squares')
# Object-oriented API (preferred)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('x')
ax.set_title('Squares')
plt.close()Artists: اللبنات الأساسية
كل ما يظهر في مخطط Matplotlib هو Artist: الـ Figure والـ Axes والخطوط والنصوص والأشكال (المستطيلات الخاصة بالأعمدة) والعلامات. يمتد تسلسل Figure-Axes-Artist الهرمي من الحاوية الخارجية إلى أصغر عنصر مرئي. يساعدك فهم هذا التسلسل على تحديد أي عنصر وتعديله برمجيًا، مثل تغيير لون عمود محدد بعد رسم المخطط.
fig, ax = plt.subplots()
line, = ax.plot([1, 2, 3], [1, 4, 9], color='blue', linewidth=2)
# Introspect the hierarchy
print('Figure:', type(fig))
print('Axes:', type(ax))
print('Line Artist:', type(line))
print('Line color:', line.get_color())
plt.close()كائنات المحاور: XAxis وYAxis
يحتوي كل Axes على كائنَي Axis (ولا ينبغي الخلط بينهما وبين Axes): ax.xaxis وax.yaxis. ويتحكمان في علامات التدريج وتسميات علامات التدريج والخط الفاصل (الخط المرئي). يمكنك ضبط حدود المحور باستخدام ax.set_xlim() وax.set_ylim()، والتحكم في تكرار علامات التدريج باستخدام ax.set_xticks()، وتنسيق التسميات باستخدام ax.xaxis.set_major_formatter().
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 40, 30, 70])
ax.set_xlim(0, 5)
ax.set_ylim(0, 80)
ax.set_xticks([1, 2, 3, 4])
ax.set_xticklabels(['Q1', 'Q2', 'Q3', 'Q4'])
ax.set_xlabel('Quarter')
ax.set_ylabel('Revenue')
plt.close()المحاور المشتركة للمخططات متعددة اللوحات
عند إنشاء شبكة من المخططات الفرعية، مرّر sharex=True أو sharey=True إلى plt.subplots() لربط مقاييس المحاور عبر اللوحات. يعني ذلك أن التكبير أو التحريك في أحد المخططات الفرعية يحدّث تلقائيًا جميع اللوحات التي تشترك في ذلك المحور، وهو أمر أساسي لمقارنة السلاسل الزمنية عبر مجموعات متعددة عندما ينبغي عرض نطاق محور x نفسه في كل لوحة.
import numpy as np
x = np.arange(10)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(6, 5))
ax1.plot(x, x**2, color='blue')
ax1.set_title('Squares')
ax2.plot(x, x**3, color='red')
ax2.set_title('Cubes')
fig.suptitle('Powers of x') # shared figure title
plt.tight_layout()
plt.close()ضبط المسافات باستخدام tight_layout()
تضبط plt.tight_layout() (أو fig.tight_layout()) معلمات المخططات الفرعية تلقائيًا لتقليل التداخل بين التسميات والعناوين وعلامات التدريج. استدعِها مباشرة قبل plt.show() أو fig.savefig(). وللتحكم الدقيق، استخدم plt.subplots_adjust(hspace=, wspace=) لضبط المسافتين الرأسية والأفقية بين المخططات الفرعية يدويًا.
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
for i, ax in enumerate(axes.flat):
ax.plot([1, 2, 3], [i, i+1, i+2])
ax.set_title(f'Panel {i+1}')
ax.set_xlabel('x axis label')
ax.set_ylabel('y axis label')
fig.suptitle('Grid of Plots', y=1.02)
plt.tight_layout() # prevents overlapping labels
plt.close()الوصول إلى Axes من subplots()
عندما تُرجع plt.subplots(nrows, ncols) عدة محاور، تُجمّع هذه المحاور في مصفوفة NumPy ذات الشكل (nrows, ncols). افهرسها كما تفهرس أي مصفوفة ثنائية الأبعاد: axes[0, 1] للصف الأول والعمود الثاني. استخدم axes.flat للتكرار على جميع المحاور بترتيب الصفوف، بصرف النظر عن شكل الشبكة، وهو أمر مناسب جدًا لتطبيق التنسيق نفسه على كل لوحة.
fig, axes = plt.subplots(2, 3, figsize=(12, 6))
# Access by row, column
axes[0, 0].set_title('Top Left')
axes[1, 2].set_title('Bottom Right')
# Iterate over all axes
for ax in axes.flat:
ax.set_xlabel('Time')
ax.set_ylabel('Value')
plt.tight_layout()
plt.close()إزالة المحاور غير المستخدمة
عند إنشاء شبكة من المخططات الفرعية من دون استخدام كل لوحة، تظل حدود إطارات المحاور الفارغة ظاهرة. استدعِ ax.set_visible(False) أو fig.delaxes(ax) لإخفاء المحاور غير المستخدمة أو إزالتها. ومن الأنماط الشائعة التكرار على axes.flat وإخفاء جميع اللوحات التي تتجاوز عدد سلاسل البيانات التي ترسمها، للحفاظ على نظافة الشكل.
fig, axes = plt.subplots(2, 3, figsize=(12, 6))
data_panels = 4 # only 4 plots needed in a 2x3 grid
for i, ax in enumerate(axes.flat):
if i < data_panels:
ax.plot([1, 2, 3], [i, i+1, i+2])
ax.set_title(f'Panel {i+1}')
else:
ax.set_visible(False) # hide extra panels
plt.tight_layout()
plt.close()اختبار سريع
اختبر فهمك لبنية Figure وAxes في Matplotlib من خلال هذا الدرس.
مراجعة الدرس
تعلّمت في هذا الدرس أن Figure هي اللوحة الكاملة، وأن Axes هي منطقة رسم واحدة داخلها؛ وأن plt.subplots() تنشئ كليهما معًا وتُرجع (fig, ax)؛ وأن واجهة API المعتمدة على الكائنات مثل ax.plot() وax.set_xlabel() مفضّلة على واجهة pyplot المعتمدة على الحالة؛ وأن tight_layout() تمنع تداخل التسميات في الأشكال متعددة اللوحات. بعد ذلك سننشئ مخططات خطية ومخططات مبعثرة مع تحكم كامل في النمط.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «بنية Figure وAxes» مجاني؟
نعم — نص درس «بنية Figure وAxes» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «بنية Figure وAxes»؟
افهم التسلسل الهرمي Figure-Axes-Artist، وأنشئ المخططات باستخدام plt.subplots()، وميّز بين واجهتي API عديمة الحالة والموجهة للكائنات. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «بنية Figure وAxes»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية Figure وAxes
- المخططات الخطية والبعثرية
- المخططات الشريطية والمدرجات التكرارية
- التسميات والعناوين وحفظ الأشكال