بايثونتصور البياناتعلم البيانات

كيفية رسم مستطيلات في Matplotlib (مع أمثلة)

دليل شامل وأكاديمي يوضح كيفية رسم المستطيلات وتخصيصها في مكتبة Matplotlib باستخدام دالة Rectangle، مدعوماً بالأمثلة التطبيقية وحالات الاستخدام المتقدمة.

تاريخ النشر

تُعد عملية التمثيل البصري للبيانات (Data Visualization) أحد الأركان الجوهرية في مسار علوم البيانات، والتحليل الإحصائي، وتطبيقات التعلم الآلي والذكاء الاصطناعي. وفي قلب هذا المضمار، تتربع مكتبة Matplotlib كحجر زاوية وبيئة برمجية تأسيسية في لغة بايثون، استندت إليها أجيال من الباحثين والمهندسين لبناء مخططات ورسوم بيانية دقيقة ومعقدة. إن القوة الكامنة وراء هذه المكتبة لا تقتصر على توليد الرسوم الشائعة مثل المخططات الخطية أو المبعثرة، بل تمتد إلى بنيتها الهندسية التحتية التي تتيح التعامل مع العناصر الرسومية الدقيقة (Primitives) وبنائها من الصفر.

تعتبر الأشكال الهندسية ثنائية الأبعاد، وفي مقدمتها المستطيلات، من أكثر الرقع الرسومية استخداماً وتأثيراً في صياغة الرسائل البصرية. فسواء كان الهدف هو تحديد فترات زمنية ذات حساسية خاصة في تحليل السلاسل الزمنية، أو بناء مخططات هندسية مخصصة كمخططات غانت وإطارات المصفوفات، أو حتى رسم صناديق التحديد المحيطية للكائنات (Bounding Boxes) في مهام الرؤية الحاسوبية؛ فإن فهم الآلية البرمجية والهندسية لرسم المستطيلات يمنح المطورين قدرة فائقة على التحكم بمخرجاتهم المرئية وإثرائها بسياقات تحليلية بالغة الدقة.

يقدم هذا الدليل الشامل تفكيكاً عميقاً وشاملاً لكيفية إنشاء، وتخصيص، وتحريك، وتحسين أداء المستطيلات داخل مكتبة Matplotlib. سنستكشف بالتفصيل الفئات البرمجية الأساسية، ونظام التحويلات الإحداثية، والمعادلات الرياضية للتدوير، بالإضافة إلى استعراض أفضل الممارسات البرمجية ودراسات الحالة التطبيقية التي تمكّن القارئ من الانتقال من الاستخدام المبدئي البسيط إلى الاحتراف الهندسي المتقدم في بناء الرقع الرسومية وتوظيفها بفعالية.

1. مقدمة إلى مكتبة Matplotlib ورسم الأشكال الهندسية الأساسية

1.1 نظرة عامة على بنية Matplotlib الرسومية (Figure و Axes)

تقوم فلسفة التصميم الداخلي لمكتبة Matplotlib على نموذج هرمي كائني التوجه (Object-Oriented Hierarchy) يفصل بصرامة بين الحاوية الكلية للمشهد ومساحات الرسم المستقلة. يمثل الكائن الأساسي الأول في هذه الهيكلية مساحة الشكل الكلي المعروفة باسم Figure، وهي تمثل اللوحة الورقية أو الإطار الشامل الذي يضم كافة العناصر البصرية، بما في ذلك الرسوم البيانية المتعددة، والنصوص التوضيحية العلوية، والعناوين الفرعية، ومفاتيح الألوان الشاملة. لا يقوم كائن Figure بتمثيل المحاور الإحداثية مباشرة، بل يعمل كمدير للمساحة الفيزيائية والشاشية ومستوى دقة الإخراج الرسومي (DPI).

في المقابل، يمثل كائن المحاور الإحداثية Axes المنطقة الفعلية التي يتم فيها إسقاط البيانات وتوليد المنحنيات والأشكال الهندسية. يحتوي كل كائن Axes على نظام إحداثيات ديكارتي أو قطبي يتألف من محورين أو أكثر، ويدير آليات القياس والتدريج (Ticks)، والتسميات التوضيحية (Labels)، ومجالات الرؤية الرياضية للبيانات. ومن الضروري لأي مطور التمييز بين مفهومي المحور المفرد Axis (الذي يمثل الخط العددي الأفقي أو الرأسي) والمحاور المجمعة Axes (التي تمثل لوحة الرسم الفرعية المستقلة المكتملة)، حيث تعيش كافة الرقع الهندسية مثل المستطيلات داخل الفضاء الإحداثي للمحاور Axes.

تتفاعل الرقع الرسومية (Patches) مع نظام الإحداثيات داخل كائن Axes عبر طبقة تجريد متقدمة من المحولات الرياضية (Transformations). عندما يتم تعريف شكل هندسي ما، فإن مكتبة Matplotlib تضع هذا الشكل داخل مصفوفة الإحداثيات الخاصة ببيانات المحور (Data Coordinates) افتراضياً، مما يعني أن أبعاد ومواقع الشكل تتغير تلقائياً وتتكيف بصرياً عند تحريك المشهد، أو تصغيره، أو تكبيره، أو إعادة ضبط الحدود القصوى والدنيا للمحاور الرياضية بما يحقق الاتساق المنطقي للرسم.

1.2 دور وحدة matplotlib.patches في المعالجة البصرية

توفر وحدة matplotlib.patches بنية متكاملة لتمثيل الأشكال ثنائية الأبعاد المغلقة، حيث تنحدر جميع هذه الأشكال من الفئة البرمجية الأساسية المسماة Patch. على عكس الرسوم النقطية البسيطة الناتجة عن دوال الرسم التقليدية مثل plot() أو scatter()، فإن كائنات Patch تمثل كيانات هندسية متجهة (Vector Graphics) تمتلك مساحة سطحية محددة، وحدوداً هندسية خارجية مغلقة، وخصائص مستقلة تماماً للون التعبئة الداخلية، وسُمك الإطار، ونمط التظليل، ومستويات الشفافية.

تتفوق الرقع الرسومية المعتمدة على الفئة Patch على الرسوم البيانية التقليدية في قدرتها على التعبير عن المفاهيم المكانية المعقدة. فبينما تُعنى الدوال القياسية برسم مسارات أحادية البعد (منحنيات) أو توزيعات نقطية منفصلة، تُعامل كائنات Patches كأجسام هندسية تمتلك هوية رياضية خاصة يمكن تحويلها، وتدويرها، وقياس تقاطعاتها، ودمجها مع بعضها البعض. هذا التمييز البرمجي يتيح للمطورين إضافة طبقات توضيحية احترافية فوق المخططات البيانية دون المساس بالبيانات الأصلية أو تشويه مقاييس الرسم.

تشتمل هذه الوحدة على مجموعة واسعة من الأشكال الهندسية المتخصصة مثل الدوائر (Circle)، والمضلعات العامة (Polygon)، والأشكال الإهليلجية (Ellipse)، والأسهم الإرشادية (FancyArrow)، والأسافين الدائرية (Wedge)، بالإضافة إلى المستطيلات (Rectangle). يضمن هذا التنوع إمكانية بناء لوحات معلومات إحصائية غاية في التعقيد، حيث تُستخدم هذه الرقع لتأطير المعطيات المهمة، وإنشاء خلفيات ملونة مشروطة، وصياغة تجارب بصرية فريدة تجمع بين دقة التعبير الرياضي والجاذبية التصميمية.

1.3 أهمية رسم المستطيلات في تمثيل البيانات والتحليل الإحصائي

يمثل المستطيل الركيزة الأكثر مرونة وانتشاراً بين كافة الأشكال الهندسية في علوم البيانات والتحليل الإحصائي المتقدم. تتجلى أهمية المستطيلات في قدرتها البديهية على تحديد نطاقات ثنائية الأبعاد تُعبر عن تقاطع فترتين مغلقتين على المحورين الأفقي والرأسي. يُستخدم هذا النمط على نطاق واسع في تحليل السلاسل الزمنية لتسليط الضوء على فترات الأزمات الاقتصادية، أو أوقات توقف الخوادم البرمجية، أو مراحل التجارب المعملية الاستثنائية، مما يجذب انتباه المتلقي فوراً إلى مناطق الانحرافات والأنماط الشاذة في البيانات.

وفي مجال الرؤية الحاسوبية (Computer Vision) والتعلم العميق، تشكل المستطيلات البنية الأساسية لما يُعرف بصناديق التحديد المحيطية (Bounding Boxes). تُستخدم هذه الصناديق لتحديد مواقع الكائنات المكتشفة داخل الصور الرقمية، مثل وجوه الأشخاص، والمركبات، والآفات الزراعية، والعيوب التصنيعية، حيث يُعبر كل مستطيل عن إحداثيات ومجال وجود الكائن بدقة بكسلية مع كتابة نسب الثقة الإحصائية (Confidence Scores) والتصنيفات فوق الإطار الخارجي للمستطيل.

علاوة على ذلك، تُعد المستطيلات اللبنة البرمجية التأسيسية التي تُبنى منها مخططات بيانية متخصصة بالكامل لا توفرها الدوال الافتراضية الجاهزة دائماً بالمرونة المطلوبة. تشمل هذه التطبيقات بناء مخططات غانت (Gantt Charts) المخصصة لإدارة المشروعات وجدولة العمليات الزمنية المتزامنة، وتوليد الخرائط الحرارية اليدوية (Custom Heatmaps)، وتصميم المخططات الهيكلية (Treemaps) التي تعتمد على تقسيم المساحة المستطيلة كلياً للتعبير عن البيانات الهرمية وتوزيع الأوزان النسبية للقطاعات المختلفة.

2. الدالة matplotlib.patches.Rectangle: التركيب البنيوي والمعاملات الأساسية

2.1 تحليل الإحداثيات المرجعية (xy Anchor Point)

تتطلب فئة matplotlib.patches.Rectangle فهماً دقيقاً لنقطة الارتكاز المرجعية الافتراضية، والتي يُرمز لها بالمعامل xy. في نظام الإحداثيات الديكارتي القياسي المعمول به في مكتبة Matplotlib، يُشير هذا المعامل إلى زوج مرتب من القيم العددية (x, y) يحدد الموقع الرياضي الدقيق للزاوية السفلية اليسرى (Lower-Left Corner) للمستطيل، وذلك قبل تطبيق أي عمليات تدوير أو تحويلات تآلفية لاحقة.

تُترجم هذه الإحداثيات إلى موضع فيزيائي على رقعة الرسم بناءً على مقاييس المحاور النشطة للكائن Axes. إذا كانت المحاور خطية (Linear Scales)، فإن القيمة x تتطابق مع القراءة المباشرة على المحور الأفقي، والقيمة y مع القراءة المقابلة على المحور الرأسي. ولكن ينبغي للمطور الحذر الشديد عند التعامل مع محاور معكوسة الترتيب (Inverted Axes) أو مقاييس لوغاريتمية، حيث يمكن لنقطة الارتكاز أن تتغير دلالتها المكانية ظاهرياً فتتحول الزاوية السفلية إلى زاوية علوية في فضاء الشاشة دون أن يتغير تعريفها الرياضي داخل بنية الكائن البرمجية.

إن الافتراض الشائع بأن نقطة xy تمثل المركز الهندسي للمستطيل هو أحد أكثر الأخطاء المفاهيمية انتشاراً بين المبتدئين. لمعالجة هذا الالتباس وحساب موضع مستطيل مركزه نقطة معلومة (cx, cy)، يجب على المبرمج إجراء إزاحة حسابية متعمدة بطرح نصف العرض من الإحداثي الأفقي ونصف الارتفاع من الإحداثي الرأسي، لتصبح نقطة الارتكاز الرياضية مطابقة للصيغة: (cx - width / 2, cy - height / 2).

2.2 تحديد الأبعاد: العرض (width) والارتفاع (height)

يُحدد الحجم الهندسي للمستطيل من خلال معاملين مستقلين هما width (العرض الأفقي) وheight (الارتفاع الرأسي). يتم التعبير عن هذين المعاملين بنفس الوحدات الإحداثية الرياضية المعتمدة على محاور البيانات، ما لم يتم تحديد نظام تحويل مخصص ومستقل. ويعبر العرض عن المسافة الممتدة على طول المحور الأفقي، بينما يمثل الارتفاع الامتداد الموازي للمحور الرأسي انطلاقاً من نقطة الارتكاز xy.

تتيح مكتبة Matplotlib للمطورين إمكانية تمرير قيم سالبة لكل من العرض والارتفاع، وهو ما يؤدي إلى سلوك هندسي محدد؛ حيث إن تمرير قيمة سالبة للعرض يدفع المستطيل إلى التمدد نحو اليسار (الاتجاه السالب للمحور الأفقي) بدءاً من نقطة xy، بينما يؤدي تمرير قيمة سالبة للارتفاع إلى تمدد المستطيل نحو الأسفل (الاتجاه السالب للمحور الرأسي). تمنح هذه الخاصية مرونة برمجية عالية عند حساب الفروق الإحداثية الناتجة عن عمليات السحب والإفلات أو النماذج الرياضية التي تحسب متجهات الانزياح دون الحاجة لإعادة ترتيب القيم الصغرى والعظمى يدوياً.

عند التعامل مع المقاييس غير المتجانسة، مثل المخططات التي تحتوي على مقياس لوغاريتم على أحد المحاور ومقياس خطي على الآخر، يجب الانتباه إلى أن العرض أو الارتفاع الهندسي لن يظهر ككتلة منتظمة خطياً إذا تم حسابه بفروق جبرية بسيطة. في مثل هذه الحالات المعقدة، يتم احتساب الأبعاد بالاعتماد على الفروق الأسية لضمان أن تغطي المساحة المستطيلة النطاق المطلوب تماماً دون تشويه في حدود الرقعة الرسومية.

2.3 معامل زاوية التدوير (angle) وآلية الدوران الرياضية

يتيح المعامل angle تدوير المستطيل بزاوية محددة يتم التعبير عنها بالدرجات (Degrees) وليس بالراديان (Radians). وفقاً للمعايير الهندسية لمكتبة Matplotlib، يتم التدوير افتراضياً بعكس اتجاه عقارب الساعة (Counter-Clockwise) حول نقطة الارتكاز المرجعية xy (الزاوية السفلية اليسرى الأصلية)، مما يؤدي إلى تغيير مسارات وتوجه كافة أضلاع المستطيل داخل الفضاء ثنائي الأبعاد.

تعتمد آلية الدوران على تطبيق مصفوفة التحويل التآلفي الرياضية (Affine Transformation Matrix) المباشرة على متجهات الرؤوس الخاصة بالمستطيل. وإذا كانت الزاوية الممررة موجبة، فإن المستطيل يرتفع نحو الأعلى واليسار انطلاقاً من زاوية تثبيته، في حين يؤدي استخدام الزوايا السالبة إلى تدوير المستطيل في اتجاه عقارب الساعة (Clockwise). وتستوعب المكتبة أي قيمة عددية للزاوية، سواء كانت كسورية أو تتجاوز 360 درجة، حيث تخضع لحساب باقي القسمة الدائري تلقائياً.

من الأهمية بمكان إدراك الفارق الهندسي بين تدوير المستطيل حول نقطة ارتكازه xy وتدويره حول مركزه الهندسي. التدوير حول الزاوية يغير الموقع الفضائي لكامل كتلة المستطيل ويبعد مركزه عن موقعه الأصلي، في حين أن التدوير حول المركز يحافظ على موقع المستطيل العام في المشهد ويغير اتجاه أضلاعه فقط. يتطلب تحقيق التدوير حول المركز صياغة تحويلات إحداثية إضافية سنفصلها رياضياً وبرمجياً في الأقسام اللاحقة من هذا المقال.

3. خطوة بخطوة: رسم أول مستطيل على الرسم البياني

3.1 تهيئة بيئة العمل واستيراد المكتبات الضرورية

للبدء في رسم الأشكال الهندسية، يتعين أولاً تهيئة بيئة العمل واستيراد الوحدات المسؤولة عن معالجة الرسوم والعمليات الرياضية. نعتمد بشكل رئيسي على واجهة matplotlib.pyplot لبناء وإدارة الأشكال، بالإضافة إلى استيراد الصنف Rectangle مباشرة من وحدة matplotlib.patches. كما يُفضل استيراد مكتبة NumPy لتوليد البيانات الرياضية والتعامل مع المصفوفات الحسابية بكفاءة عالية.

يتم إنشاء مساحة الرسم والمحاور بالاعتماد على الأسلوب الموجه كائنياً (Object-Oriented API) عبر استدعاء الدالة plt.subplots()، حيث تمنح هذه المنهجية المطور تحكماً كاملاً ودقيقاً في خصائص كل محور بمعزل عن البيئة الشاملة، مما يمنع التداخلات غير المرغوبة عند بناء لوحات رسومية متقدمة. يتم تحديد حجم الشكل الكلي بالبوصة عبر المعامل figsize لضمان وضوح الأبعاد وتناسق النسب البصرية.

يُنصح بالتأكد من حداثة إصدار Matplotlib المستخدم وتوافق بيئة العرض، سواء كان التنفيذ يتم داخل دفاتر تفاعلية مثل Jupyter Notebooks (مع تفعيل خيار العرض المباشر للرسوم المتجهة) أو من خلال نصوص بايثون برمجية مستقلة يتم تصدير مخرجاتها إلى ملفات رسومية عالية الدقة.

3.2 إنشاء مخطط خطي أولي وإضافة المستطيل عبر ax.add_patch

تبدأ الخطوة التنفيذية الأولى برسم مجموعة من البيانات المرجعية لإنشاء نطاق إحداثي حقيقي على كائن المحاور ax. على سبيل المثال، يمكن رسم منحنى جيبي بسيط (Sine Wave) لتجسيد توزيع البيانات الرياضية على طول المحورين، مما يسهل استيعاب كيفية تموضع الرقعة الهندسية فوق البيانات الأساسية.

بعد تهيئة المنحنى البياني، يتم بناء كائن المستطيل من خلال استدعاء الصنف Rectangle مع تمرير نقطة الارتكاز (xy)، والعرض (width)، والارتفاع (height). بمجرد إنشاء الكائن البرمجي في الذاكرة، فإنه لا يظهر تلقائياً على الرسم حتى يتم تسجيله وتمريره صراحة إلى كائن المحاور عبر التابع المخصص ax.add_patch(). يخبر هذا الإجراء محرك التصيير الداخلي لمكتبة Matplotlib بضرورة إدراج المستطيل ضمن قائمة العناصر الرسومية المطلوب معالجتها وعرضها عند استدعاء الدالة plt.show().

Rectangle in matplotlib
Rectangle in matplotlib

يوفر استدعاء ax.add_patch() آلية لربط التحويلات الإحداثية الخاصة بكائن المحاور مع المستطيل الجديد، مما يضمن أن تتطابق وحدات قياس المستطيل تماماً مع الوحدات العددية للمنحنى المرسوم. وبذلك، يتحول المستطيل من مجرد مفهوم هندسي مجرد إلى كائن رسومي يتفاعل بصرياً مع مقاييس البيانات المحيطة به.

3.3 ضبط حدود المحاور (Axis Limits) لضمان ظهور المستطيل كاملاً

من الخصائص المعمارية المهمة في مكتبة Matplotlib أن الرقع الرسومية المضافة عبر ax.add_patch() قد لا تُحدّث حدود المحاور الإحداثية (Data Limits) تلقائياً في جميع السيناريوهات، على عكس دوال الرسم الشائعة مثل plot() التي تقوم بتعديل النطاق الإحداثي بصورة ديناميكية لتشمل كافة النقاط المدخلة. يرجع ذلك إلى أن الرقع تُعامل غالباً كعناصر توضيحية إضافية قد تقع خارج النطاق الأساسي للبيانات.

إذا تم إنشاء مستطيل في موقع يقع كلياً أو جزئياً خارج نطاق البيانات المرسومة مسبقاً، فقد يظهر المستطيل مقطوعاً أو يختفي تماماً عن مساحة الرؤية. لحل هذه المشكلة وضمان ظهور الرقعة الهندسية بكامل تفاصيلها، يجب على المطور التدخل برمجياً لتوسيع حدود المحاور عبر الدوال الصريحة ax.set_xlim(xmin, xmax) و ax.set_ylim(ymin, ymax) بما يغطي أبعاد المستطيل ونقاط ارتكازه.

كبديل منهجي متقدم، يمكن استخدام دالة التحديث التلقائي للحدود بالجمع بين ax.relim() لإعادة احتساب حدود البيانات الإجمالية، متبوعة بالدالة ax.autoscale_view() لإجبار كائن المحاور على تكييف مجال الرؤية واستيعاب كافة العناصر الرسومية المضافة، مما يضمن تدفقاً برمجياً مرناً لا يتطلب حساب النهايات الرياضية يدوياً في كل مرة.

4. تخصيص المظهر الجمالي وتنسيق المستطيل

4.1 التحكم في لون التعبئة (facecolor) ومستوى الشفافية (alpha)

يوفر التنسيق اللوني للمستطيل وسيلة قوية لتوجيه الإدراك البصري وإبراز الأنماط المعقدة. يُتحكم في اللون الداخلي للرقعة المستطيلة عبر المعامل facecolor (أو اختصاراً fc). تدعم مكتبة Matplotlib منظومة واسعة لتوصيف الألوان؛ تشمل الأسماء القياسية للألوان (مثل 'teal' أو 'crimson')، والأكواد الست عشرية بنظام هيكس (Hex Codes مثل '#2b5c8f')، بالإضافة إلى التنسيقات الرقمية المعتمدة على الفضاءات اللونية RGB أو RGBA كقيم عشرية محصورة بين 0.0 و 1.0.

في الحالات التي يتطلب فيها التصميم عرض الحدود الخارجية للمستطيل فقط دون تغطية الخلفية، يمكن تعيين المعامل المنطقي fill=False، أو ضبط لون التعبئة ليكون شفافاً كلياً عبر تمرير القيمة 'none'. يتيح هذا النمط تأطير المجموعات البيانية وحصر مجالات البيانات المتقاطعة دون حجب المنحنيات والنقاط الإحصائية التي تقع داخل حيز المستطيل.

يلعب معامل الشفافية alpha دوراً حاسماً في تحقيق التوازن الجمالي والوظيفي. يقبل هذا المعامل قيماً كسرية تتراوح بين 0.0 (شفافية مطلقة وغير مرئية) و 1.0 (إعتام كامل ولون مصمت). يفيد استخدام مستويات شفافية متوازنة (مثل alpha=0.25) في تظليل مساحات زمنية أو مجالات ثقة إحصائية مع السماح للمتلقي برؤية خطوط الشبكة الإرشادية والمنحنيات البيانية التحتية بوضوح تام ودون تشويش بصري.

4.2 تخصيص حدود المستطيل (edgecolor و linewidth)

يتم إدارة الإطار الخارجي للمستطيل بشكل مستقل تماماً عن التعبئة الداخلية، مما يمنح المطور حرية كاملة في صياغة تباينات بصرية دقيقة. يُستخدم المعامل edgecolor (أو اختصاراً ec) لتحديد لون خط المحيط الخارجي للمستطيل. ومن الممارسات التصميمية الشائعة اختيار لون إطار ذي درجة داكنة مشتقة من نفس الصبغة اللونية لسطح التعبئة الداخلي، مما يعطي الشكل مظهراً احترافياً وأنيقاً.

يتحكم المعامل linewidth (أو اختصاراً lw) في سُمك الخط الخارجي للمستطيل، ويُقاس هذا المعامل بنقاط الطباعة الفيزيائية (Typographic Points). يتيح ضبط سُمك الإطار إمكانية إبراز مناطق التركيز الرئيسية بجعل خطوطها أكثر سماكة، أو تخفيف حدة الإطارات الثانوية لتجنب إرهاق عين المشاهد.

علاوة على ذلك، توفر المكتبة معاملات دقيقة للتحكم في كيفية التقاء الخطوط عند زوايا المستطيل الأربع، وهي المعامل joinstyle الذي يقبل خيارات مثل 'miter' (زوايا حادة ومدببة)، أو 'round' (زوايا منحنية وناعمة)، أو 'bevel' (زوايا مشطوفة ومسطحة). تساهم هذه التفاصيل الميكانيكية الدقيقة في موائمة الهوية البصرية للمخطط مع المعايير التصميمية المتقدمة للتقارير والأوراق العلمية المحكمة.

4.3 تطبيق أنماط الخطوط (linestyles) والتظليل النمطي (hatch)

لتنويع التعبير البصري وإيصال دلالات إحصائية مختلفة، يمكن تغيير نمط رسم خط الإطار الخارجي باستخدام المعامل linestyle (أو ls). يدعم هذا المعامل خيارات متعددة تشمل الخط المتصل ('solid' أو '-')، والخط المتقطع ('dashed' أو '--')، والخط المنقط ('dotted' أو ':')، والخط المتناوب بين النقاط والشرطات ('dashdot' أو '-.'). تُستخدم الإطارات المتقطعة على سبيل المثال للدلالة على فترات تنبؤية مستقبلية أو نطاقات غير مؤكدة تماماً في التحليل.

بالإضافة إلى الألوان الصامتة، تتيح فئة Rectangle إضافة أنماط تظليل بنيوية مصفوفية داخل مساحة المستطيل عبر المعامل hatch. تتكون هذه الأنماط من رموز نصية تمثل أشكالاً هندسية دقيقة، مثل الخطوط المائلة نحو اليمين ('/')، أو الخطوط المائلة نحو اليسار ('')، أو الخطوط العمودية ('|')، أو الأفقية ('-')، أو التقاطعات الشبكية ('+' و 'x')، والدوائر الصغيرة ('o' و 'O')، والنجوم ('*').

Custom rectangle with styling in Matplotlib
Custom rectangle with styling in Matplotlib

يمكن زيادة كثافة نمط التظليل بتكرار الرمز البرمجي عدة مرات؛ فعلى سبيل المثال، يؤدي استخدام hatch='///' إلى إنتاج خطوط مائلة متقاربة جداً وأكثر كثافة مقارنة بـ hatch='/'. يُعد التظليل النمطي أداة لا غنى عنها في الأبحاث والمطبوعات الأكاديمية التي يتم نشرها باللونين الأبيض والأسود فقط، أو لضمان إمكانية قراءة المخططات للأشخاص الذين يعانون من درجات مختلفة من عمى الألوان (Color Vision Deficiency)، حيث يعتمد التمييز هنا على النمط الشكلي وليس التباين اللوني فقط.

5. رسم وتدوير المستطيلات بزوايا مخصصة

5.1 الأساس الرياضي للتدوير في فضاء الإحداثيات

تستند عملية تدوير الأشكال الهندسية في الفضاء ثنائي الأبعاد إلى حسابات الجبر الخطي ومصفوفات التحويل التآلفي. عند تدوير نقطة متجهة ذات إحداثيات $\begin{\pmatrix} x y \end{\pmatrix}$ بزاوية مقدارها $\theta$ بالنسبة لنقطة الأصل، تخضع الإحداثيات لعملية الضرب المصفوفي مع مصفوفة الدوران القياسية المعرفة بالصيغة:

$$\begin{\pmatrix} x’ y’ \end{\pmatrix} = \begin{\pmatrix} \cos\theta &a\mp; -\sin\theta \sin\theta &a\mp; \cos\theta \end{\pmatrix} \begin{\pmatrix} x y \end{\pmatrix}$$

تطبق مكتبة Matplotlib هذه التحويلات رياضياً على كافة رؤوس المستطيل الأربعة. ولكن يبرز تحدٍ بصري حاسم يتعلق بنسبة العرض إلى الارتفاع (Aspect Ratio) للمحاور الإحداثية. فإذا كان المقياس على المحور الأفقي مختلفاً عن المقياس على المحور الرأسي (أي أن وحدة المسافة على المحور $X$ لا تطابق فيزيائياً نفس عدد البكسلات لوحدة المسافة على المحور $Y$)، فإن الزاوية الهندسية الناتجة ستظهر مشوهة وغير مطابقة للقيمة الرياضية المدخلة، وقد يبدو المستطيل وكأنه متوازي أضلاع مائل.

لضمان الحفاظ على صحة الزوايا هندسياً وتجنب التشوهات البصرية الناتجة عن تفاوت المقاييس، يجب تفعيل التكافؤ الهندسي للمحاور باستخدام التعليمة البرمجية ax.set_aspect('equal'). يفرض هذا الأمر على بيئة التصيير تطبيق نفس المقياس الفيزيائي الدقيق لكلا المحورين، مما يجعل الزوايا المدورة (مثل 45 درجة أو 90 درجة) تظهر بشكلها الطبيعي والصحيح أمام المستخدم.

5.2 تطبيقات عملية على تدوير المستطيلات بزوايا موجبة وسالبة

عند تحديد زاوية تدوير موجبة في معامل angle، مثل angle=45، يقوم محرك Matplotlib بتثبيت الزاوية السفلية اليسرى (xy) في موقعها المحدد، ثم يقوم بتدوير الضلع السفلي والضلع الأيسر بمقدار 45 درجة عكس اتجاه عقارب الساعة. ينتج عن ذلك انتقال الرؤوس الثلاثة الأخرى إلى مواقع جديدة في فضاء الرسم يمكن حسابها بدقة عبر دوال الجيب وجيب التمام الرياضية.

في المقابل، يؤدي تمرير زوايا سالبة، مثل angle=-30، إلى تدوير المستطيل باتجاه عقارب الساعة. يُعد التدوير السلبي مفيداً للغاية عند الحاجة إلى توجيه مستطيل على طول منحنى إحصائي متناقص، أو عند محاذاة الصناديق التوضيحية مع مصفوفات البيانات المتجهة نحو الأسفل. يتيح هذا التماثل إمكانية تدوير المستطيلات بأي زاوية دقيقة لتتوافق مع اتجاهات الانحدار الخطي للبيانات.

توضح المقارنة البصرية بين مستطيلات متعددة تشترك في نفس نقطة الارتكاز (xy) ونفس الأبعاد (width, height) ولكن تختلف في زوايا دورانها كيف ينفتح المشهد على مروحة هندسية من الرقع المستقلة. يتيح هذا الأسلوب بناء أشكال توضيحية مركبة، مثل تمثيل متجهات السرعة الزاوية، أو صياغة حدود الأمان الميكانيكية للآلات الدوارة في المخططات الهندسية.

5.3 معالجة التدوير حول المركز بدلاً من نقطة الارتكاز

كما أشرنا سابقاً، تدور الرقعة المستطيلة افتراضياً حول زاوية ارتكازها xy. غير أن الكثير من التطبيقات العملية — وخاصة في مجالات الرؤية الحاسوبية ومعالجة الصور المائلة — تتطلب تدوير المستطيل حول مركزه الهندسي (cx, cy) للحفاظ على موضعه الكلي وتغيير اتجاهه فقط. لتحقيق ذلك، توفر Matplotlib نظام تحويلات متقدماً يعتمد على الفئة matplotlib.transforms.Affine2D.

تعتمد المنهجية الرياضية والبرمجية لتدوير المستطيل حول مركزه على تسلسل تحويلي يتألف من ثلاث خطوات متعاقبة: أولاً، نقل المستطيل بحيث يصبح مركزه مطابقاً لنقطة الأصل $(0, 0)$ عبر إزاحة سالبة بمقدار نصف العرض ونصف الارتفاع؛ ثانياً، تطبيق مصفوفة الدوران بالزاوية المطلوبة؛ وثالثاً، إعادة نقل المستطيل إلى موقعه الإحداثي المستهدف في فضاء البيانات (cx, cy). يُدمج هذا التسلسل التحويلي أخيراً مع محول بيانات المحور ax.transData.

Rotated rectangle on an image in Matplotlib
Rotated rectangle on an image in Matplotlib

يضمن تطبيق هذا التسلسل عبر كائنات التحويل التحاماً تاماً للمستطيل مع مساحة الرسم، بحيث يظل المركز الهندسي ثابتاً بصرياً أثناء التدوير، بينما تتغير إحداثيات الزوايا الأربع بسلاسة هندسية مطلقة، مما يوفر حلاً معمارياً متكاملاً لمسألة الصناديق المحيطية الموجهة (Oriented Bounding Boxes – OBB).

6. إضافة وتنسيق مستطيلات متعددة في مخطط واحد

6.1 توليد مستطيلات متعددة برمجياً باستخدام الحلقات التكرارية

في التطبيقات الواقعية، نادراً ما يقتصر العمل على رسم مستطيل واحد منفرد؛ بل تتطلب لوحات البيانات توليد العشرات أو المئات من المستطيلات لتمثيل فئات متعددة أو عناصر زمنية متعاقبة. يُعد استخدام الحلقات التكرارية البرمجية (مثل حلقات for) المنهج الأساسي لإنشاء وتنسيق هذه المستطيلات ديناميكياً من خلال قراءة مصفوفات أو جداول البيانات (مثل أطر بيانات Pandas DataFrames).

يمكن تخزين إحداثيات وأبعاد المستطيلات داخل هياكل بيانات منظمة مثل القوائم أو القواميس، ثم المرور عليها تكرارياً لإنشاء كائن Rectangle مستقل لكل عنصر وإضافته إلى المحور عبر ax.add_patch(). تتيح هذه المنهجية تخصيص مظهر كل مستطيل بشكل فردي بناءً على قيم البيانات المقابلة له، كأن يتم تحديد لون التعبئة بالاعتماد على خريطة لونية تدريجية (Colormap) تتناسب مع المتغير العددي الممثل.

يساعد هذا التوليد البرمجي المؤتمت في بناء رسوم بيانية شديدة التعقيد والتخصيص بأقل قدر من الأسطر البرمجية، مع ضمان سهولة صيانة الكود وتحديثه عند تغير حجم البيانات المدخلة أو معايير التصنيف الإحصائي المعتمدة في التحليل.

6.2 إدارة ترتيب الطبقات الرسومية وضبط معامل zorder

عند تراكب عناصر بصرية متعددة داخل نفس المساحة الإحداثية — مثل رسم نقاط مبعثرة، وخطوط بيانية، وشبكات إرشادية، ومستطيلات مظللة — تصبح إدارة العمق البصري وترتيب ظهور الطبقات عاملاً حاسماً لتجنب حجب البيانات المهمة. تدير مكتبة Matplotlib هذه الأسبقية البصرية من خلال معامل ترتيبي يُعرف باسم zorder.

تمتلك العناصر الرسومية المختلفة قيماً افتراضية محددة لمعامل zorder؛ حيث تأتي خطوط الشبكة الإرشادية (Gridlines) افتراضياً عند القيمة zorder=1.5، بينما تمتلك الرقع الهندسية المستطيلة القيمة zorder=1، وترتفع الخطوط البيانية إلى zorder=2، وتستقر النقاط المبعثرة والنصوص التوضيحية عند مستويات أعلى (مثل zorder=3 وما فوق). تُرسم العناصر ذات القيم الأقل أولاً في الخلفية، تليها العناصر ذات القيم الأعلى لتعلو فوقها في واجهة العرض.

إذا رغب المطور في استخدام مستطيل كخلفية تظليلية عامة لمنطقة معينة، فيجب تعيين معامل المستطيل ليكون منخفضاً (مثل zorder=0) لضمان بقائه خلف كافة الخطوط والنقاط وخطوط الشبكة. أما إذا كان الهدف هو استخدام المستطيل كقناع حاجب يُخفي جزءاً من البيانات المشوهة أو غير المرغوب في إظهارها، فيمكن رفع قيمة المعامل (مثل zorder=5) ليتقدم فوق جميع الطبقات الأخرى ويلغي ظهورها تماماً.

6.3 بناء هياكل شبكية ولوحات مصفوفية هندسية

يمتد توظيف المستطيلات المتعددة إلى بناء هياكل شبكية منتظمة تحاكي رقع الشطرنج أو المصفوفات الرياضية ثنائية الأبعاد. يتطلب هذا النمط الرياضي استخدام حلقتين تكراريتين متداخلتين لحساب إحداثيات الزوايا (i * step_x, j * step_y) وتوليد خلايا مستطيلة متراصة تغطي رقعة الرسم بالكامل وبدقة متناهية.

يمكن تضمين فجوات فاصلة محسوبة (Gaps / Margins) بين المستطيلات المتجاورة من خلال تعديل العرض والارتفاع الفعليين للخلية ليكون أقل بقليل من مقدار خطوة الانتقال الشبكية، مما يخلق شبكة هندسية منفصلة الخلايا تزيد من وضوح الفواصل البصرية. يفيد هذا الأسلوب في بناء لوحات تجريدية مخصصة لعرض مصفوفات الارتباط الإحصائي (Correlation Matrices) دون الاعتماد على دوال الخرائط الحرارية التقليدية.

بالإضافة إلى ذلك، يمكن تطبيق التلوين الشرطي على خلايا الشبكة برمجياً؛ بحيث يُفحص الرقم المقابل لكل خلية في المصفوفة، ويُحدد لون المستطيل تلقائياً وفقاً لشروط منطقية مسبقة (مثل تلوين القيم الموجبة بدرجات اللون الأخضر، والقيم السالبة بدرجات اللون الأحمر، وتعيين شفافية المستطيل بناءً على الدلالة الإحصائية للرقم)، مما ينتج لوحة معلومات بصرية فائقة القوة والدقة التحليلية.

7. تسليط الضوء على المناطق الزمنية والفئات البيانية

7.1 تحديد الفترات الحرجة في الرسوم البيانية للسلاسل الزمنية

يُمثل تحليل السلاسل الزمنية أحد أبرز الميادين التي يظهر فيها الأثر التحليلي لاستخدام الرقع المستطيلة. فعند دراسة المؤشرات المالية التاريخية، أو معدلات درجات الحرارة العالمية، أو أداء الخوادم السحابية، تبرز الحاجة لتأطير فترات استثنائية محددة، مثل فترات الركود الاقتصادي، أو موجات الطقس المتطرفة، أو فترات التحديثات البرمجية الشاملة.

تتعامل مكتبة Matplotlib مع التواريخ الزمنية من نوع datetime بعد تحويلها داخلياً إلى أرقام عشرية تُمثل عدد الأيام منذ حقبة زمنية مرجعية عبر الوحدة matplotlib.dates. لرسم مستطيل يظلل فترة زمنية معينة، يتم تحويل تاريخ البداية وتاريخ النهاية إلى أرقام متوافقة باستخدام دالة date2num()، ثم يُحسب العرض كفارق زمني بين التاريخين، بينما يُضبط الارتفاع ليغطي النطاق الكامل للمتغير المقاس على المحور الرأسي.

يساعد دمج التعبئة شبه الشفافة للمستطيل المظلل مع منحنى السلسلة الزمنية في منح القارئ سياقاً تفسيرياً مباشراً؛ حيث يربط المشاهد بين التغيرات الحادة في سلوك المنحنى والحدث الخارجي المؤطر بالمستطيل دون انقطاع في القراءة البصرية لحركة البيانات التاريخية.

7.2 المقارنة التفصيلية بين Rectangle ودوال axvspan و axhspan

توفر مكتبة Matplotlib دوال مريحة ومباشرة لتظليل النطاقات تسمى ax.axvspan() لتظليل الشرائط الرأسية الممتدة، و ax.axhspan() للشرائط الأفقية. ومن الأهمية بمكان للباحث والمطور فهم الفروق الوظيفية والمعمارية الدقيقة بين استخدام هذه الدوال السريعة واستخدام الصنف العام Rectangle.

تمتد الأشرطة الناتجة عن axvspan() تلقائياً من الحد الأدنى للرسم إلى الحد الأقصى للمحور الرأسي (من 0 إلى 1 في فضاء المحور)، وتتكيف ديناميكياً مع أي تغيير في حدود المحور الرأسي، مما يجعلها مثالية لتظليل فترات زمنية كاملة دون الاكتراث بقيم المحور $Y$. وبالمثل، تمتد أشرطة axhspan() لتغطي المحور الأفقي بالكامل وتتحدد قيمتها بنطاق محدد على المحور الرأسي فقط.

في المقابل، يمنحك الصنف Rectangle استقلالاً مطلقاً وتحكماً ثنائي الأبعاد في كلا المحورين معاً في فضاء البيانات؛ حيث يمكنك تحديد نقطة بداية ونهاية مقيدة تماماً لكل من $X$ و $Y$. يُفضل استخدام Rectangle عند الرغبة في تأطير منطقة محصورة جداً (مثل فقاعة زمنية لم تتجاوز حدوداً سعرية معينة)، أو عند الحاجة لتطبيق زوايا دوران مائلة، أو عند بناء مفاتيح إيضاح مخصصة، بينما تُفضل الدوال axvspan و axhspan للتظليل الشامل والممتد عبر كامل اتساع المحاور.

7.3 تمثيل مجالات الثقة ونطاقات الخطأ الإحصائي

في النمذجة الإحصائية والتنبؤية، لا تقتصر النتائج على قيمة نقطية واحدة، بل تقترن دائماً بنطاقات عدم يقين ومجالات ثقة (Confidence Intervals) أو حدود سماحية الخطأ المعياري. تُستخدم المستطيلات لتجسيد هذه المجالات في المخططات التي تتناول تقييم أداء النماذج ومراقبة الجودة الصناعية.

يمكن للمطور رسم مستطيل يحيط بكل نقطة قياس، بحيث يمثل عرض المستطيل مجال الخطأ في المتغير المستقل $\Delta X$، بينما يمثل ارتفاعه نطاق عدم اليقين في المتغير التابع $\Delta Y$. هذا التمثيل الهندسي ثنائي الأبعاد، المعروف أحياناً بصناديق عدم اليقين (Uncertainty Boxes)، يتفوق على أشرطة الخطأ البسيطة (Error Bars) أحادية البعد في إبراز مساحات التسامح الهندسي المشتركة بدقة متناهية.

كما يمكن توظيف المستطيلات ذات التدرجات الشفافة المتراكبة لتمثيل مستويات انحراف معياري متعددة ($\pm 1\sigma, \pm 2\sigma, \pm 3\sigma$)؛ حيث تُعطى النطاقات الداخلية ألواناً أكثر كثافة لتعكس احتمالية إحصائية أعلى، بينما تتلاشى النطاقات الخارجية تدريجياً لتعبر عن انخفاض الكثافة الاحتمالية للتوزيع، مما يثري التقارير الإحصائية ببعد بصري عميق ومفهوم رياضياً.

8. استخدام المستطيلات لتأطير النصوص والشروحات التوضيحية

8.1 دمج الصناديق المستطيلة مع النصوص عبر معامل bbox في ax.text

تتكامل المستطيلات بصورة وثيقة مع النصوص التوضيحية لإنشاء تعليقات شارحة متميزة وقابلة للقراءة فوق المخططات الكثيفة. بدلاً من حساب أبعاد المستطيل وموضعه يدوياً ليتطابق مع حجم الكلمات المكتوبة، توفر دالة إضافة النصوص ax.text() معاملاً قوياً ومخصصاً يُدعى bbox.

يقبل المعامل bbox قاموساً من الخصائص التنسيقية يوجه محرك Matplotlib لبناء مستطيل محيط بالنص تلقائياً وبأبعاد تتكيف ديناميكياً مع طول الجملة وحجم الخط المستخدم. يتم التحكم في مظهر هذا الصندوق عبر مفاتيح القاموس مثل boxstyle (نمط الصندوق)، و facecolor (لون التعبئة)، و edgecolor (لون الإطار)، و alpha (الشفافية)، بالإضافة إلى معامل الحشوة الداخلية pad.

تضمن هذه الآلية المؤتمتة بقاء النص التوضيحي مقروءاً بوضوح تام، حتى لو وقع فوق منحنيات متعرجة أو شبكات بيانية مزدحمة؛ حيث يعمل المستطيل كخلفية عازلة تفصل الحروف النصية عن الضوضاء البصرية المحيطة بها، وتضفي طابعاً احترافياً على الرسوم التوضيحية والإنفوجرافيك العلمي.

8.2 تخصيص أنماط الزوايا والهوامش (BoxStyle)

تتيح مكتبة Matplotlib تخصيص البنية الهندسية لصناديق النصوص المستطيلة عبر الصنف المتقدم matplotlib.patches.BoxStyle. يوفر هذا الصنف مجموعة متنوعة من الأنماط الجاهزة التي تغير شكل الزوايا وتصميم الحواف بمرونة برمجية فائقة.

من بين الأنماط الأكثر استخداماً نجد النمط المربع الكلاسيكي 'square'، والنمط ذو الزوايا الدائرية الناعمة 'round'، والنمط الدائري المتقدم ذو الحواف المنحوتة 'round4'، بالإضافة إلى نمط وسيلة الشرح ذي سن المنشار 'sawtooth'، ونمط الصندوق المتصل برأس سهم إرشادي 'rarrow' أو 'larrow'. يتم تمرير هذه الأنماط كنصوص مباشرة أو ككائنات برمجية مع تحديد معاملات إضافية دقيقة.

يتيح المعامل pad داخل نمط الصندوق التحكم الدقيق في مقدار الهامش الداخلي الفاصل بين أحرف النص والحدود الخارجية للمستطيل. كما يتيح معامل rounding_size في نمط 'round' تحديد نصف قطر انحناء الزوايا بدقة بكسلية، مما يمكن المطور من تصميم بطاقات توضيحية عصرية (Modern Cards) تتسق تماماً مع مفاهيم التصميم واجهات المستخدم الحديثة.

8.3 إنشاء عناصر وسيلة الإيضاح (Legend) المخصصة باستخدام Patches

في كثير من الرسوم البيانية المعقدة، قد لا تكون العناصر المراد شرحها في وسيلة الإيضاح (Legend) ناتجة عن دوال رسم تقليدية تمتلك وسوماً مباشرة label، أو قد تتضمن اللوحة عناصر رمزية مركبة مثل مناطق مظللة ذات دلالات نوعية خاصة. لحل هذه المشكلة، تبرز تقنية بناء مفاتيح الإيضاح البديلة (Proxy Artists) باستخدام كائنات matplotlib.patches.Patch.

تعتمد هذه التقنية على إنشاء كائنات Rectangle مستقلة في الذاكرة دون إضافتها إلى كائن المحاور عبر add_patch()، مع ضبط خصائصها اللونية وأنماط تظليلها لتتطابق تماماً مع الظواهر الممثلة في الرسم البياني. يتم بعد ذلك تمرير هذه الرقع المستطيلة المصطنعة كقائمة إلى المعامل handles في دالة ax.legend()، مع تمرير قائمة التسميات المقابلة إلى المعامل labels.

تمنح هذه المنهجية المطور سلطة مطلقة في هيكلة وتنسيق نافذة وسيلة الإيضاح، والتحكم في ترتيب مفاتيحها، وصياغة شروحات بصرية معقدة تميز بين البيانات الحقيقية، والبيانات المتوقعة، ومناطق عدم اليقين، وحالات التحذير، مما يرتقي بالقدرة التواصلية للرسم البياني إلى مستويات احترافية عالية.

9. تحويلات الإحداثيات المتقدمة والمستطيلات المتجاوبة

9.1 فهم أنظمة الإحداثيات المتعددة في Matplotlib

تعتمد مكتبة Matplotlib في جوهرها على خط أنابيب تحويلي هرمي (Transformation Pipeline) شديد التطور يربط بين فضاءات إحداثية متعددة، وهو ما يفسر مرونتها الاستثنائية في معالجة الرسوم المعقدة. يجب على المطور المتقدم إدراك الفروق الهندسية بين أربعة فضاءات إحداثية رئيسية تعمل بالتوازي داخل المشهد الرسومي:

  • فضاء البيانات (Data Coordinates – ax.transData): وهو الفضاء الافتراضي الذي تُقاس فيه المواضع بوحدات البيانات الرياضية المرسومة على المحاور. يتغير موقع وحجم المستطيل في هذا الفضاء تلقائياً عند تكبير المخطط أو تغيير نطاق المحاور.
  • فضاء المحاور (Axes Coordinates – ax.transAxes): نظام إحداثي نسبي يمثل مساحة المحور المستقل؛ حيث تمثل النقطة $(0, 0)$ الزاوية السفلية اليسرى لمنطقة الرسم، والنقطة $(1, 1)$ الزاوية العلوية اليمنى، بغض النظر تماماً عن القيم الرياضية للمحاور.
  • فضاء الشكل الكلي (Figure Coordinates – fig.transFigure): نظام نسبي يغطي اللوحة الورقية الكلية للشكل من $(0, 0)$ إلى $(1, 1)$، ويُستخدم لتنسيق العناصر التي تعبر فوق محاور متعددة أو تلتصق بحواف النافذة الإجمالية.
  • فضاء العرض الفيزيائي (Display / Pixel Coordinates): الفضاء النهائي الذي يقيس المسافات بوحدات بكسل الشاشة الفعلية، وتتغير قيمه عند تغيير حجم نافذة البرنامج أو تعديل كثافة الشاشة DPI.

إن إدراك كيفية انتقال الكائنات الهندسية بين هذه الفضاءات عبر مصفوفات التحويل التآلفي هو المفتاح الأساسي لبناء مستطيلات ذكية تتصرف بدقة وفقاً للمتطلبات التصميمية والوظيفية للرسم.

9.2 تطبيق محول ax.transAxes لرسم مستطيلات ثابتة الموضع

في العديد من سيناريوهات بناء لوحات المعلومات، نحتاج إلى رسم مستطيل يظل ثابتاً في موقعه وحجمه النسبي بالنسبة لإطار الرسم، كأن ننشئ صندوقاً لمعلومات الملخص الإحصائي في الزاوية العلوية اليمنى، أو خلفية مخصصة لشعار تحليلي، بحيث لا يتأثر هذا الصندوق إطلاقاً بتغير بيانات المحاور أو عمليات التحريك والتكبير (Pan & Zoom).

لتحقيق هذا السلوك، يتم تمرير المعامل transform=ax.transAxes عند بناء كائن Rectangle. في هذه الحالة، تُفسر إحداثيات نقطة الارتكاز xy والأبعاد width و height كنسب مئوية عشرية تتراوح بين 0.0 و 1.0. على سبيل المثال، تمرير xy=(0.05, 0.85) مع width=0.3 و height=0.1 سينتج مستطيل يلتصق دائماً بالركن العلوي الأيسر ويشغل 30% من عرض المحور و 10% من ارتفاعه بصرف النظر عن أي تغييرات تطرأ على البيانات الرياضية.

كما تدعم المكتبة تقنية متقدمة تُعرف باسم التحويلات الهجينة أو المدمجة (Blended Transformations) عبر الوحدة matplotlib.transforms.blended_transform_factory. تتيح هذه التقنية ربط الإحداثي الأفقي بفضاء البيانات $X$ بينما يرتبط الإحداثي الرأسي بفضاء المحاور $Y$ (أو العكس)، وهو الأساس الرياضي الذي تُبنى عليه دوال مثل axvspan، حيث يمتد المستطيل عبر كامل ارتفاع المحور مع بقائه مقيداً بإحداثيات زمنية أو رقمية دقيقة على المحور الأفقي.

9.3 التعامل مع نسبة العرض إلى الارتفاع وإعادة القياس التلقائي

عند تغيير أبعاد نافذة الرسم أو تصدير المخطط بنسب شاشية مختلفة (Aspect Ratios)، قد تخضع الأشكال الهندسية لتشوهات بصرية إذا لم تتم إدارة التحويلات بدقة. تتأثر المستطيلات المبنية في فضاء البيانات بنسبة المقاييس بين المحورين، بينما تحتفظ المستطيلات المبنية في فضاء البكسل المطلق بأبعاد هندسية فيزيائية ثابتة لا تتغير مع التكبير.

للحفاظ على نسبة أبعاد ثابتة ومربعة لمستطيل معين دون إجبار كامل المحاور على التساوي، يمكن ربط مسار المستطيل بمحولات إزاحة متقدمة (Offset Transforms) من وحدة matplotlib.transforms. تتيح هذه البنية تحديد نقطة ارتكاز المستطيل بوحدات البيانات الرياضية، بينما تُحدد أبعاده (العرض والارتفاع) بوحدات النقاط الطباعية أو البكسلات الثابتة.

تضمن هذه المعالجة الهندسية المتقدمة أن يظل المستطيل التوضيحي محتفظاً بحجمه الأنيق ومظهره المتناسق مهما قام المستخدم بتغيير حجم نافذة العرض التفاعلية، مما يوفر تجربة بصرية متجاوبة واحترافية تلائم التطبيقات البرمجية الموزعة والمواقع الإلكترونية التفاعلية.

10. رسم المستطيلات التفاعلية والديناميكية والرسوم المتحركة

10.1 تحريك المستطيلات وتغيير أبعادها عبر FuncAnimation

لا تتوقف قدرات Matplotlib عند المشاهد الساكنة؛ بل تمتد لتشمل توليد الرسوم المتحركة الديناميكية العالية السلاسة عبر الفئة matplotlib.animation.FuncAnimation. تتيح هذه الفئة تحريك وتحديث خصائص المستطيلات عبر الزمن لمحاكاة الظواهر المتغيرة، مثل نمو الأعمدة البيانية التراكمية، أو تتبع حركة الكائنات في المقاطع المرئية.

تعتمد الآلية البرمجية لتحريك المستطيل بكفاءة على تعديل خصائص كائن Rectangle الموجود بالفعل في الذاكرة بدلاً من إعادة إنشائه ومسحه في كل إطار زمني (Frame). يتم ذلك داخل دالة التحديث التكرارية باستخدام التوابع المخصصة مثل rect.set_x()، و rect.set_y()، و rect.set_width()، و rect.set_height()، أو التابع الشامل rect.set_bounds(x, y, width, height) الذي يضبط كافة الحدود الإحداثية في عملية واحدة.

لتحقيق أعلى أداء تصيير ممكن وتجنب التقطيع أثناء الحركة، يتم تفعيل ميزة الرسم النقطي السريع المعروفة باسم Blitting بتمرير blit=True في دالة التحريك. يقوم محرك التصيير في هذه الحالة بإعادة رسم الرقعة المستطيلة المتحركة فقط وتحديث بكسلاتها المباشرة دون الحاجة لإعادة معالجة خلفية المحاور الثابتة وشبكات الإحداثيات، ويمكن تصدير الناتج النهائي بسلاسة إلى صيغ الفيديو الرقمية مثل MP4 أو ملفات الصور المتحركة GIF.

10.2 بناء أدوات التحديد التفاعلي باستخدام RectangleSelector

توفر وحدة الأدوات التفاعلية matplotlib.widgets مكوناً برمجياً غاية في الأهمية يُعرف باسم RectangleSelector. يتيح هذا المكون للمستخدمين النقر والسحب بمؤشر الفأرة فوق رقعة الرسم لرسم مستطيل تحديد تفاعلي في الوقت الحقيقي (Real-time Interactive Selection)، وهو تطبيق جوهري في برمجيات استكشاف البيانات ووسم الصور لمهام الذكاء الاصطناعي.

يتم تفعيل الأداة عبر ربطها بكائن المحاور ax وتمرير دالة استجابة مرجعية (Callback Function) تُستدعى تلقائياً بمجرد إفلات زر الفأرة. تستقبل هذه الدالة إحداثيات الضغط الأول وإحداثيات الإفلات ككائنات أحداث (eclick, erelease)، مما يتيح استخراج النطاق الإحداثي الدقيق للمستطيل المرسوم (xmin, xmax, ymin, ymax) وتوظيفه في تصفية البيانات أو تقريب المشهد (Zooming) على المنطقة المحددة.

يمكن تخصيص المظهر البصري لمستطيل التحديد التفاعلي أثناء حركة الفأرة عبر تمرير قاموس التنسيق props، والذي يحدد لون الإطار وسُمكه، ومستوى شفافية التعبئة الداخلية أثناء عملية السحب، مما يوفر واجهة مستخدم تفاعلية تتطابق مع أرقى المعايير البرمجية لتطبيقات سطح المكتب العلمية.

10.3 التقاط أحداث الفأرة والتفاعل مع نقرات المستطيلات (Event Handling)

تتضمن البنية التحتية لمكتبة Matplotlib نظاماً متكاملاً لإدارة ومعالجة الأحداث الرسومية (Event Handling System) يربط المشهد بمدخلات المستخدم كالفأرة ولوحة المفاتيح. يمكن للمطور استغلال هذا النظام لجعل الرقع المستطيلة تستجيب مباشرة لنقرات الفأرة أو مرور المؤشر فوقها.

يتم ربط حدث النقر عبر استدعاء fig.canvas.mpl_connect('button_press_event', on_click). وداخل دالة المعالجة on_click، يتم فحص ما إذا كانت إحداثيات نقرة الفأرة تقع داخل النطاق الهندسي للمستطيل باستخدام التابع المدمج rect.contains(event). يرجع هذا التابع قيمة منطقية True مصحوبة بقاموس التفاصيل الهندسية إذا حدث تصادم بين نقطة النقر والمساحة المستطيلة.

بمجرد اكتشاف النقر على المستطيل، يمكن تنفيذ إجراءات تفاعلية فورية؛ مثل تغيير لون تعبئة المستطيل rect.set_facecolor() لتأكيد اختياره، أو إظهار نافذة تلميح نصية منبثقة (Tooltip) تعرض تفاصيل إحصائية إضافية حول المنطقة المنقورة، متبوعة باستدعاء fig.canvas.draw_idle() لتحديث المشهد الرسومي فوراً وبسلاسة.

11. الأخطاء البرمجية الشائعة واستكشاف المشكلات وإصلاحها

11.1 مشكلة اختفاء المستطيل بسبب عدم تحديث حدود المحاور تلقائياً

تُعد مشكلة “المستطيل المختفي” من أكثر العقبات إحباطاً للمطورين الجدد في Matplotlib؛ حيث يكتب المبرمج كود إنشاء المستطيل ويستدعي ax.add_patch(rect)، لكن المخطط الناتج يظهر فارغاً تماماً دون أي أثر للمستطيل. لا يعود هذا إلى خطأ في بناء الكائن، بل إلى الآلية المعمارية لمجال الرؤية في المحاور.

عند إضافة كائن Rectangle إلى مساحة رسم لا تحتوي على بيانات سابقة، تظل حدود المحاور الافتراضية محصورة بين النقطتين $(0.0, 1.0)$ لكلا المحورين. فإذا تم وضع المستطيل عند إحداثيات مثل xy=(10, 20) وبأبعاد width=5, height=5، فإن المستطيل يستقر فعلياً في فضاء الذاكرة لكنه يقع خارج نافذة الرؤية المعروضة على الشاشة كلياً.

لتجنب هذا الخطأ البرمجي، يجب اتباع قاعدة ذهبية: إما تحديد حدود المحاور يدوياً وبشكل صريح عبر ax.set_xlim() و ax.set_ylim() بما يستوعب أبعاد ومواقع كافة الرقع المضافة، أو استدعاء الدالتين المتتاليتين ax.relim() متبوعة بـ ax.autoscale_view() لإجبار المحور على إعادة احتساب مجالات الرؤية وإظهار الرقعة المستطيلة فوراً.

11.2 أخطاء الترتيب الطبقي وحجب العناصر الرسومية

من المشكلات البصرية الشائعة أيضاً اختفاء منحنيات البيانات أو نقاط التشتت الإحصائي فجأة بعد إضافة مستطيل مظلل لتأطير المنطقة. يرجع السبب المباشر وراء هذه الظاهرة إلى تعارض في قيم الترتيب الطبقي zorder والشفافية alpha.

إذا أُضيف مستطيل يمتلك لون تعبئة مصمت (alpha=1.0) وقيمة zorder افتراضية أو مساوية لقيمة المنحنى البياني، فإن محرك التصيير يقوم برسم المستطيل فوق البيانات، مما يؤدي إلى حجبها تماماً عن عين المشاهد وكأنها حُذفت من الرسم. كما يؤدي وضع مستطيلات غير مدروسة الطبقات إلى حجب خطوط الشبكة الإرشادية الأساسية (Gridlines)، مما يفقد المخطط دقته المرجعية.

لحل هذه المشكلة جذرياً، يجب الالتزام ببروتوكول صارم للترتيب الطبقي؛ بتعيين zorder=0 للمستطيلات التظليلية مع ضبط الشفافية عند قيم منخفضة (بين 0.15 و 0.3)، وتعيين zorder=2 أو أعلى للمنحنيات والبيانات النقطية، وتفعيل خطوط الشبكة عند zorder=1، مما يضمن ظهور كافة المكونات في طبقات بصرية متناسقة لا تحجب إحداها الأخرى.

11.3 سوء فهم إحداثيات نقطة الارتكاز والزوايا السلبية

ينبع خطأ شائع آخر من افتراض بعض المطورين أن النقطة xy تقع في منتصف المستطيل، مما يقود إلى إزاحات مكانية خاطئة عند محاولة محاذاة المستطيل مع أحداث أو مؤشرات معينة. يؤدي هذا الخلط إلى ظهور المستطيل مزاحاً نحو اليمين والأعلى بمقدار نصف أبعاده الحقيقية.

بالإضافة إلى ذلك، فإن استخدام العرض أو الارتفاع السالب لتمديد المستطيل في الاتجاه المعاكس قد ينتج عنه ارتباك إضافي عند دمج هذا التمدد مع زوايا الدوران angle؛ حيث إن تطبيق مصفوفة الدوران على أبعاد سالبة قد يعكس اتجاه الدوران الظاهري ويزيح نقطة النهاية إلى أرباع إحداثية غير متوقعة رياضياً.

لتجنب هذه الالتباسات، يُوصى دائماً بتوحيد المعايير الرياضية بجعل قيمتي width و height موجبتين دائماً، وحساب نقطة الارتكاز الحقيقية (x_min, y_min) للزاوية السفلية اليسرى مسبقاً قبل إنشاء الكائن. وفي حال الرغبة في التدوير، يجب تحديد نقطة الارتكاز المقصودة بوضوح وضبط الزاوية وفقاً لنظام الإحداثيات المعتمد دون الاعتماد على مضاعفات الإشارات السالبة المعقدة.

11.4 تحسين الأداء عند رسم آلاف المستطيلات باستخدام PatchCollection

عند بناء تطبيقات معالجة البيانات الضخمة التي تتطلب رسم آلاف المستطيلات المنفصلة (كما في الخرائط الجغرافية التفصيلية، أو مسح مصفوفات الجينوم الحيوية)، يؤدي استخدام حلقة تكرارية تستدعي ax.add_patch() لكل مستطيل على حدة إلى تدهور حاد في سرعة المعالجة واستنزاف هائل لذاكرة النظام، وقد يتجمد البرنامج كلياً نتيجة إنشاء آلاف الكائنات المستقلة في شجرة الرسم.

يكمن الحل المعماري الاحترافي لهذه المشكلة في استخدام الصنف المجمع matplotlib.collections.PatchCollection المستورد من وحدة matplotlib.collections. بدلاً من إضافة كل مستطيل ككائن مستقل إلى المحور، يتم إنشاء قائمة بسيطة تضم كافة كائنات Rectangle، ثم تُمرر هذه القائمة دفعة واحدة إلى PatchCollection ليتم دمجها في كائن رسومي موحد عالي الأداء.

يتيح كائن PatchCollection إدارة خصائص الألوان والتعبئة والشفافية لكافة المستطيلات دفعة واحدة على مستوى مصفوفات C الداخلية السريعة في Matplotlib، كما يدعم تمرير مصفوفات الألوان وتطبيق خرائط التدرج اللوني (Colormaps) بكفاءة معالجة تفوق الطرق التقليدية بعشرات المرات، مما يتيح تصيير أكثر من 100,000 مستطيل في أجزاء من الثانية دون أي تباطؤ في واجهة الاستخدام.

12. دراسات حالة وتطبيقات عملية متكاملة

12.1 بناء خريطة حرارية مخصصة من الصفر باستخدام مستطيلات ملونة

لتجسيد القوة البرمجية لدمج المستطيلات، نستعرض دراسة حالة لبناء خريطة حرارية تفصيلية (Custom Heatmap) بالكامل دون استخدام دوال جاهزة مثل imshow() أو مكتبة Seaborn. تتيح هذه الطريقة التحكم الكامل في كل خلية ككيان هندسي مستقل يمكن تعديل حوافه، وتظليله، وتدويره، وربطه بأحداث تفاعلية خاصة.

تبدأ العملية بتوليد مصفوفة بيانات رقمية ثنائية الأبعاد تمثل مثلاً معدلات الأداء عبر قطاعات تشغيلية مختلفة. نقوم بتهيئة مقياس تطبيع لوني (Color Normalization) يربط القيم الرقمية بمجال تدرج لوني محدد بين 0.0 و 1.0 باستخدام matplotlib.colors.Normalize، مع اختيار خريطة لونية مثل 'viridis' أو 'plasma' لتحويل الأرقام إلى قيم ألوان RGBA دقيقة.

باستخدام حلقتين تكراريتين متداخلتين، يتم إنشاء كائن Rectangle لكل خلية مصفوفية عند الموضع xy=(j, i) بأبعاد متساوية width=0.9, height=0.9 مع ترك فجوة مقدارها 0.1 لإنشاء إطار فاصل أنيق. يتم تعيين لون التعبئة بناءً على القيمة اللونية المستخرجة، ويُضاف نص مركزي يكتب القيمة العددية داخل المستطيل بلون متباين يضمن وضوح القراءة. وأخيراً، يتم دمج شريط ألوان جانبي (Colorbar) مستقل يوضح الدلالة الرقمية للتدرجات اللونية، لينتج تقرير بصري متكامل عالي الدقة.

12.2 تصميم مخطط غانت (Gantt Chart) لإدارة المشاريع وجدولة المهام

تعتمد إدارة المشروعات وهندسة العمليات الصناعية على مخططات غانت لتتبع الجداول الزمنية للمهام والتبعيات التشغيلية. تمثل المستطيلات الأفقية البنية المثالية لبناء هذه المخططات، حيث يمثل موقع المستطيل على المحور الأفقي زمن بدء المهمة، ويمثل عرضه المدة الزمنية اللازمة لإنجازها، بينما يمثل موضعه الرأسي المسار أو القسم المسؤول عن التنفيذ.

لبناء مخطط غانت احترافي، نقوم بتجهيز جدول بيانات يحتوي على أسماء المهام، وتواريخ البدء، وفترات الإنجاز بالأيام، ونسبة الاكتمال المحققة، وفئة المسار الحرج (Critical Path). يتم رسم كل مهمة كمستطيل أفقي عند الإحداثي الرأسي المقابل لترتيب المهمة، مع تخصيص لون المستطيل ليعكس حالة المهمة (مثلاً، اللون الرمادي للمهام المكتملة، والأزرق للمهام قيد التنفيذ، والأحمر الداكن لمهام المسار الحرج المهددة بالتأخير).

يمكن تعزيز المخطط بإضافة مستطيل داخلي أصغر متراكب داخل المستطيل الأساسي ليعبر عرضه بدقة عن نسبة الإنجاز المحققة (Progress Bar). نقوم بعد ذلك بضبط تدريجات المحور الرأسي لتحمل أسماء المهام بوضوح، وتنسيق المحور الأفقي ليعرض التواريخ الزمنية بشكل أنيق، مما يوفر أداة إدارية مرئية فائقة القوة تتيح لمدراء المشاريع استيعاب الموقف التنفيذي الشامل في ثوانٍ معدودة.

12.3 تطبيق صناديق الكشف (Bounding Boxes) في معالجة الصور والرؤية الحاسوبية

في عصر الذكاء الاصطناعي، يمثل اكتشاف الكائنات وتحديد مواقعها في الصور (Object Detection) أحد أكثر التطبيقات طلباً. عند تشغيل نماذج التعلم العميق المتقدمة مثل YOLO أو Faster R-CNN، تُنتج هذه النماذج مصفوفات تحتوي على إحداثيات الصناديق المحيطية لكل كائن مكتشف مقترنة بنسبة الثقة والتصنيف النوعي.

لتصور هذه النتائج بدقة، نبدأ بعرض الصورة الرقمية الأصلية كخلفية للمحور باستخدام دالة ax.imshow(image). بعد ذلك، نمر عبر مخرجات النموذج ونحول إحداثيات الصناديق إلى معاملات مطابقة لـ Rectangle؛ حيث تُمثل الزاوية السفلية أو العلوية (وفقاً لاتجاه المحور في الصور الرقمية) نقطة الارتكاز xy، وتحدد الفروق المكانية العرض والارتفاع المطلوبين.

Draw rectangle on imagine in matplotlib
Draw rectangle on imagine in matplotlib

يتم رسم المستطيل بخط إطار سميك ولون مميز (مثل الأخضر الليموني الفاقع) وبدون تعبئة داخلية (fill=False, linewidth=2.5). وفوق الحافة العلوية لكل مستطيل، يتم دمج صندوق نصي مستطيل صغير مصمت يحمل اسم الفئة المصنفة (مثل “Car: 98.4%”)، مما ينتج لوحة مخرجات بصرية مطابقة لأعلى المعايير الاحترافية المعتمدة في أبحاث وتطبيقات الرؤية الحاسوبية والأنظمة الذكية المستقلة.

خاتمة شاملة

استعرضنا في هذا الدليل التأسيسي والشامل كافة الأبعاد الهندسية والبرمجية لرسم وتخصيص وتحريك المستطيلات في مكتبة Matplotlib. لقد تبين لنا أن الرقعة المستطيلة، برغم بساطتها الظاهرية، تمثل أداة تحليلية فائقة المرونة والعمق؛ تتكامل مع الهيكل الكائني للمكتبة، وتتفاعل مع التحويلات التآلفية المعقدة، وتوفر حلولاً عملية لمسائل بالغة التنوع تمتد من التحليل المالي للسلاسل الزمنية إلى تطبيقات الذكاء الاصطناعي والرؤية الحاسوبية المتقدمة.

إن استيعاب المفاهيم الجوهرية مثل نقطة الارتكاز، وإدارة الفضاءات الإحداثية المتعددة، والتحكم في الترتيب الطبقي zorder، وتجميع الرقع عبر PatchCollection، يمكّن الباحثين والمهندسين من تجاوز قيود الدوال الجاهزة وبناء رسوم بيانية مخصصة بالكامل تتميز بالدقة الرياضية والجمال البصري في آن واحد. ندعو المطورين إلى تطبيق هذه المنهجيات والتقنيات البرمجية للارتقاء بجودة تقاريرهم ومخرجاتهم العلمية إلى أعلى مستويات الاحتراف والتأثير.

References

اقتباس هذا المقال

looti, M. (2026, أغسطس 27). كيفية رسم مستطيلات في Matplotlib (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-draw-rectangles-in-matplotlib-with-examples/
looti, Mohammed. “كيفية رسم مستطيلات في Matplotlib (مع أمثلة).” عرب سايكلوجي, 27 أغسطس 2026, https://arabpsychology.com/statistics/how-to-draw-rectangles-in-matplotlib-with-examples/.
looti, Mohammed. “كيفية رسم مستطيلات في Matplotlib (مع أمثلة).” عرب سايكلوجي. أغسطس 27, 2026. https://arabpsychology.com/statistics/how-to-draw-rectangles-in-matplotlib-with-examples/.