بايثونتصور البياناتمكتبة Matplotlib

كيفية رسم الدوائر في Matplotlib (مع أمثلة)

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

تاريخ النشر

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

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

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

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

1.1 أهمية التمثيل البصري للأشكال الهندسية في تحليل البيانات

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

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

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

1.2 مفهوم الرقع الهندسية (Patches) في هيكلية Matplotlib

تعتمد مكتبة Matplotlib في بنيتها المعمارية على مفهوم هرمي صارم للكائنات المرئية يُعرف بنظام “الفنانين” (Artist Hierarchy)، وتُمثل كائنات الرقع الهندسية (Patch Objects) الفئة المتخصصة في رسم الكائنات ثنائية الأبعاد ذات المساحات المصمتة أو المفرغة والمحددة بحواف مغلقة، والتي تتبع الفرع البرمجي matplotlib.patches.

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

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

1.3 المتطلبات الأساسية وإعداد بيئة العمل البرمجية

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

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

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

2. البنية البرمجية الأساسية لدالة matplotlib.patches.Circle

2.1 الصيغة العامة ومعاملات الإدخال الأساسية (Syntax and Parameters)

تُعد الفئة matplotlib.patches.Circle البنية الأساسية المسؤولة عن بناء وتوليد كائنات الدوائر الرياضية في Matplotlib. تتطلب الصيغة البرمجية التأسيسية لهذه الفئة تحديد معاملين إلزاميّين هما: مركز الدائرة ونصف قطرها، إلى جانب باقة واسعة من المعاملات الاختيارية التي تضبط السلوك الهندسي والمظهر الجمالي.

يستقبل المعامل xy زوجاً مرتباً يمثل إحداثيات مركز الدائرة (x, y) في فضاء البيانات الإحداثي، ويجب تمريره كقائمة أو صف رقمي مكون من عنصرين، بينما يحدد المعامل radius القيمة العددية لنصف القطر بالوحدات الإحداثية لنظام المحاور المعتمد، وتكون قيمته الافتراضية مساوية للوحدة الواحدة (1.0) في حال عدم تحديده صراحة.

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

Circle in matplotlib
Circle in matplotlib

2.2 مفهوم إضافة الفنانين (Add Artist) إلى المحاور

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

توفر مكتبة Matplotlib آليتين رئيسيتين لتثبيت الرقعة الهندسية على المحور: الدالة العامة ax.add_artist() والدالة المتخصصة ax.add_patch(). في حين تقبل الدالة الأولى أي كائن رسومي يرث من فئة Artist الأساسية، فإن الدالة الثانية مصممة خصيصاً لاستقبال كائنات الرقع الهندسية، مما يجعلها الخيار الأنسب دلالياً ووظيفياً، حيث تتولى ax.add_patch() تحديث الخصائص الإحصائية للمحور ومراقبة حدود البيانات بشكل أكثر تكاملاً.

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

2.3 الفروق الدقيقة بين Circle و RegularPolygon و Ellipse

من الضروري للباحث والمطور التمييز الدقيق بين الأدوات الهندسية المتوفرة في Matplotlib لتمثيل الأشكال المنحنية، وتحديداً الفروق الجوهرية بين الفئات Circle و RegularPolygon و Ellipse من النواحي الرياضية والبرمجية وكفاءة المعالجة الحسابية.

تُمثل الفئة Circle دائرة إقليدية حقيقية محددة بمركز ونصف قطر ثابت في فضاء البيانات، وتُعامل داخلياً كمسار بيزييري (Bézier curve) متناظر ومنحني بدقة رياضية متناهية، بينما تعتمد الفئة RegularPolygon على توليد مضلع منتظم بعدد محدد من الرؤوس والقطع المستقيمة (مثل السداسي أو الثماني أو المضلع ذي المائة ضلع)، وهو ما يمثل تقريباً خطياً للدائرة قد يستهلك ذاكرة إضافية أو يظهر تكسرات حواف واضحة عند التكبير الرقمي العالي.

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

3. إنشاء دائرة فردية وضبط أبعاد المحاور (Single Circle Plotting)

3.1 الخطوات الأساسية لرسم أول دائرة

يتطلب رسم أول دائرة هندسية بنجاح اتباع تسلسل برمجي منظم يبدأ بتهيئة كائن الشكل (Figure) والمحور (Axes)، مروراً بإنشاء كائن الدائرة بالخصائص الهندسية المطلوبة، وانتهاءً بضبط حدود الإحداثيات وعرض المخطط النهائي للمستخدم.

تبدأ العملية باستدعاء plt.subplots() لإنشاء بيئة الرسم الإحداثية، تليها خطوة استدعاء Circle((x, y), radius) وتحديد إحداثيات المركز مثل (0.5, 0.5) ونصف القطر مثل 0.3، ثم تمرير هذا الكائن إلى المحور عبر الدالة ax.add_patch() لتثبيته في طبقة العرض.

تتمثل الخطوة الحاسمة التي يغفل عنها الكثير من المطورين المبتدئين في ضبط حدود المحاور؛ فكائنات الرقع الهندسية المضافة يدوياً لا تقوم تلقائياً بتحديث حدود المحاور السينية والصادية في بعض إصدارات المكتبة وسياقات العمل، مما يتطلب استدعاء دوال تحديد النطاق مثل ax.set_xlim() و ax.set_ylim() أو دالة plt.axis([xmin, xmax, ymin, ymax]) لضمان وقوع الدائرة بالكامل داخل المجال البصري المرئي قبل استدعاء plt.show().

3.2 تحديد أبعاد ومقاييس الرسم المناسبة

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

لضمان ظهور الدائرة بكامل تفاصيلها المحيطية مع ترك مساحة هامشية مريحة للعين، ينبغي حساب حدود المحاور بناءً على معادلة المركز ونصف القطر: بحيث يكون الحد الأدنى للمحور السيني مساوياً لـ center_x - radius - margin والحد الأقصى مساوياً لـ center_x + radius + margin، وتطبيق نفس المعادلة على المحور الصادي باستخدام إحداثي المركز center_y.

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

4. معالجة مشكلة التشويه الهندسي وضبط نسبة العرض إلى الارتفاع

4.1 تفسير ظاهرة تحول الدائرة إلى شكل بيضاوي (Aspect Ratio Distortion)

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

في الحالة الافتراضية، تقوم مكتبة Matplotlib بملء المساحة المخصصة لنافذة الرسم (والتي تكون عادة مستطيلة الشكل بنسبة أبعاد مثل 4:3 أو 16:9) عبر مط وتمديد وحدات البيانات بشكل مستقل على طول كل محور؛ فإذا كان المحور السيني يغطي نطاقاً من 0 إلى 10 ويمتد على مسافة 800 بكسل، بينما يغطي المحور الصادي نطاقاً من 0 إلى 10 ويمتد على مسافة 400 بكسل، فإن البكسل الواحد على المحور السيني سيمثل نصف القيمة المكانية للبكسل على المحور الصادي.

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

Circle matplotlib
Circle matplotlib

4.2 تطبيق الدالة plt.axis(‘equal’) و ax.set_aspect(‘equal’)

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

يتمثل الحل الكلاسيكي في واجهة Pyplot الإجرائية في استدعاء الأمر plt.axis('equal')، والذي يجبر المحرك الرسومي على تعديل حدود المحاور لتصبح المسافة المكانية لوحدة بيانات واحدة على المحور السيني مساوية تماماً للمسافة المكانية لوحدة بيانات واحدة على المحور الصادي، مما يضمن ظهور الدوائر والمربعات بأشكالها الهندسية الحقيقية دون أي انبعاج.

في المقابل، يُعتبر النهج الموجه للكائنات (Object-Oriented Approach) هو الأكثر احترافية واستقراراً في المشاريع البرمجية الكبيرة، ويتم تطبيقه عبر استدعاء الدالة ax.set_aspect('equal', adjustable='box') أو adjustable='datalim'. يتيح المعامل adjustable للمطور تحديد الكيفية التي يجب أن يستجيب بها المحرك لتحقيق التساوي؛ فإما أن يتم تعديل الأبعاد الهندسية لصندوق الرسم نفسه مع الحفاظ على حدود البيانات، أو يتم توسيع حدود البيانات لاستيعاب أبعاد الصندوق، كما توفر الخيارات الإضافية مثل 'scaled' سلوكيات متقدمة تمنع تشويه الأشكال عند تصدير الرسوم وطباعتها بدقة عالية.

5. تخصيص الخصائص الجمالية والمظهر البصري للدوائر

5.1 التحكم في الألوان والتعبئة (Fill & Facecolor)

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

يتم التحكم في لون المساحة الداخلية للدائرة عبر المعامل facecolor (أو اختصاراً fc)، والذي يدعم كافة أنساق تمثيل الألوان المعتمدة في بايثون، بما في ذلك أسماء الألوان القياسية بالإنجليزية، والأكواد الست عشرية (HEX Strings مثل '#2ca02c')، وثلاثيات ورباعيات الأرقام العشرية (RGB و RGBA) التي تتراوح قيمها بين 0.0 و 1.0 لتحديد مستويات القنوات اللونية وقناة الشفافية بدقة متناهية.

عند الرغبة في إنشاء دوائر مفرغة تقتصر على إظهار الإطار الخارجي فقط دون حجب العناصر والخلفيات البيانية الواقعة خلفها، يمكن ضبط المعامل المنطقي fill=False، أو تعيين facecolor='none' صراحة؛ كما يمكن ربط ألوان التعبئة بخرائط التدرج اللوني (Colormaps) عبر استخدام مقاييس التطبيع اللوني لتوليد دوائر تتغير ألوانها تدريجياً بناءً على متغيرات كمية مستمرة.

Circle with alpha in Matplotlib
Circle with alpha in Matplotlib

5.2 تعديل حدود الدائرة (Edgecolor, Linewidth, Linestyle)

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

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

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

5.3 إدارة الشفافية وتداخل العناصر (Alpha & Z-order)

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

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

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

6. رسم دوائر متعددة وتوزيعها الإحداثي المنهجي

6.1 إنشاء دوائر متعددة عبر الحلقات التكرارية (Iterative Plotting)

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

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

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

Multiple circles in Matplotlib
Multiple circles in Matplotlib

6.2 توليد تشكيلات إحداثية هندسية وشبكية

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

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

بالإضافة إلى التوزيع الشبكي المنتظم، يمكن توظيف دوال التوليد العشوائي مثل numpy.random.uniform أو numpy.random.normal لمحاكاة التشتت المكاني للظواهر الطبيعية وتوليد حشود دائرية غير منتظمة تحاكي عمليات التوزيع البواسوني والتجمع العنقودي، مع تطبيق شروط فحص التصادم والتقاطع الرياضي لإنشاء تشكيلات التراص الحلقي الكثيف (Circle Packing) المتقدمة.

7. تحسين الأداء البرمجي باستخدام مجموعات الرقع (PatchCollection)

7.1 مشكلة استهلاك الذاكرة وبطء التنفيذ مع الدوائر الكثيفة

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

ينبع هذا البطء من البنية الداخلية لمحرك Matplotlib؛ حيث يقوم المحرك عند إضافة كل كائن Circle منفرد بتسجيله كـ “فنان” (Artist) مستقل يمتلك بنية تحويل إحداثي كاملة، ومستمعين للأحداث، ومصفوفات حالة رسومية خاصة به. خلال عملية التصيير (Rendering) وتحديث المشهد، يضطر المحرك للمرور التسلسلي على آلاف الكائنات المنفصلة وتطبيق دوال الرسم والاستدعاءات البرمجية الفردية، مما يسبب اختناقاً كبيراً في وحدة المعالجة المركزية (CPU Overhead) وتأخيراً ملحوظاً في زمن الاستجابة.

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

7.2 بناء وإدارة PatchCollection بكفاءة عالية

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

تقوم استراتيجية PatchCollection على تجميع قائمة ضخمة من كائنات الدوائر الأولية وتمريرها ككتلة برمجية موحدة إلى المحور الإحداثي عبر استدعاء وحيد للدالة ax.add_collection(). يقوم محرك الرسم بمعالجة هذه المجموعة ككائن رسومي مركب واحد، حيث يتم توحيد عمليات التحويل الإحداثي والتصيير على مستوى مصفوفات C الداخلية السريعة، مما يقلل العبء الحسابي بنسب تتجاوز 90% مقارنة بالطريقة الفردية.

تتميز PatchCollection بقدرتها الفائقة على إدارة الألوان والتدرجات عبر مصفوفات القيم الرقمية؛ إذ يمكن تمرير مصفوفة قيم كمية إلى الدالة set_array() وتطبيق خريطة لونية (Colormap) مخصصة مع ضبط حدود التطبيع اللوني (Norm). يتيح هذا النهج ربط شريط لوني جانبي متكامل (Colorbar) بالمجموعة الدائرية مباشرة عبر plt.colorbar(collection)، مما يوفر أداة بيانية فائقة القوة والدقة لتمثيل البيانات العلمية المعقدة بأعلى درجات الكفاءة البرمجية.

8. دمج الدوائر مع المخططات البيانية التكميلية (Data Integration)

8.1 الدوائر كحدود عتبية ونطاقات ثقة في مخططات التشتت (Scatter Plots)

تكتسب الدوائر قيمة تحليلية مضاعفة عندما تُدمج بسلاسة مع المخططات البيانية القياسية، وخاصة مخططات التشتت النقطي (Scatter Plots)، حيث تعمل الدوائر كإطارات مرجعية وحدود عتبية تعزل المجموعات الإحصائية وتبرز الانحرافات المعيارية للبيانات الموزعة.

في تطبيقات النمذجة الإحصائية والتعلم الآلي، يُستخدم تراكب الدوائر فوق نقاط البيانات لتحديد مجالات المجموعات الناتجة عن خوارزميات التجميع مثل K-Means؛ حيث تُمثل النقطة المركزية موقع المتوسط الحسابي للعنقود، بينما يُعبر نصف القطر عن أقصى مسافة إقليدية للنقاط التابعة للمجموعة أو يمثل نطاق ثقة محدد (مثل 95% من التوزيع الاحتمالي للبيانات المحيطة بالمركز).

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

8.2 الجمع بين الدوائر والرسوم الخطية والمتجهية

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

في الرسوم البيانية الشبكية (Network Graphs)، تُستخدم الدوائر لتمثيل العقد (Nodes) التي تلتقي عندها حواف وشبكات الاتصال والروابط البرمجية، حيث يمكن تغيير حجم ولون كل دائرة ليعكس درجة مركزية العقدة (Degree Centrality) أو وزنها النسبي في الشبكة، مع رسم الخطوط والأسهم التي تصل بين مراكز هذه الدوائر بدقة إحداثية تامة.

في سياق الفيزياء والتحليل الميداني، يُعد دمج الدوائر مع مخططات حقول المتجهات (Quiver Plots) وسيلة مثالية لتمثيل نقاط الجذب والتنافر ومصادر الجهد ومصارفه؛ حيث تُرسم الدوائر في مواقع الشحنات أو الكتل النقطية المركزية بينما تنطلق الأسهم المتجهية من محيط الدائرة لتعبر عن شدة واتجاه المجال الكهربائي أو المغناطيسي أو تدفق الموائع المحيطة بالكتلة الهندسية.

9. إنشاء دوائر متداخلة ومخططات دائرية متحدة المركز (Concentric Circles)

9.1 الأسس الرياضية لتوليد الدوائر متحدة المركز

تُمثل الدوائر متحدة المركز (Concentric Circles) تشكيلاً هندسياً كلاسيكياً يشترك فيه عدد من الدوائر في نقطة أصل ومركز موحد (x0, y0) مع التباين المنتظم أو اللوغاريتمي في متتالية أنصاف الأقطار، وتستند هذه التشكيلات إلى مبادئ التناظر الشعاعي والانقسام المساحي المنتظم.

من الناحية الرياضية، تنمو مساحة الدائرة كدالة تربيعية في نصف القطر وفق المعادلة الشهيرة (A = pi r^2). عند تصميم دوائر متداخلة تهدف إلى تمثيل زيادات مساحية متساوية (Equal-area rings) لحلقات العرض، يجب ألا تكون الفروق بين أنصاف الأقطار خطية، بل يجب حساب نصف قطر كل دائرة جديدة كجذر تربيعي للمساحة التراكمية المستهدفة لضمان العدالة البصرية في المساحات المعروضة بين الحلقات المتعاقبة.

يتم توليد هذه الدوائر برمجياً عبر تثبيت إحداثيات المركز في استدعاءات متكررة لـ Circle((x0, y0), r)، مع تمرير متتالية عددية لأنصاف الأقطار من مصفوفة NumPy، وتطبيق تدرج لوني منتظم يربط بين البعد الشعاعي عن المركز وشدة اللون، مما يمنح المخطط عمقاً بصرياً ثلاثي الأبعاد يعكس التغير التدريجي للظاهرة من بؤرتها المركزية نحو أطرافها الخارجية.

9.2 تطبيقات الدوائر المتحدة المركز في تمثيل البيانات

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

في التحليلات الجغرافية المكانية، تُستخدم الدوائر متحدة المركز لترسيم نطاقات القرب والمسافات المكانية المتزايدة (Buffer Zones) حول موقع مركزي كمنشأة صناعية أو مستشفى أو مركز زلزال، مما يسهل تقدير الأثر البيئي أو النطاق الزمني للوصول السريع على مسافات متتالية مثل 5 و 10 و 15 كيلومتراً.

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

10. التحريك البصري والتفاعل الديناميكي مع الدوائر (Animations)

10.1 استخدام Matplotlib FuncAnimation لتحريك الدوائر

يتيح الانتقال من الرسوم البيانية الثابتة إلى الرسوم المتحركة الديناميكية إمكانية استعراض تطور الظواهر عبر الزمن ومحاكاة الحركة الفيزيائية للجسيمات والأنظمة المدارية، وتوفر فئة matplotlib.animation.FuncAnimation البنية البرمجية المتطورة لتحقيق هذا التحريك الإجرائي عالي السلاسة.

تعتمد آلية التحريك على بناء دالة تحديث دورية (Update Function) يتم استدعاؤها في كل إطار زمني (Frame) لتعديل الخصائص الهندسية لكائن الدائرة الموجود مسبقاً على مساحة الرسم دون الحاجة لإعادة إنشاء المشهد بالكامل؛ حيث يتم تعديل موقع المركز عبر دالة circle.set_center((new_x, new_y)) لمحاكاة الحركة الانتقالية، أو تعديل نصف القطر عبر circle.set_radius(new_r) لمحاكاة ظواهر النبض والتوسع الحجمي والموجي.

لتحقيق أقصى درجات الكفاءة وتفادي التقطيع في العرض الرسومي (Flickering)، يُنصح بشدة بتفعيل خاصية الإرجاع النقطي السريع (Blitting) عبر تعيين blit=True في FuncAnimation؛ تجبر هذه الخاصية محرك الرسم على إعادة تصيير البكسلات التي تغيرت فقط داخل حدود الدائرة المتحركة مع الحفاظ على ثبات طبقة الخلفية والمحاور الإحداثية، مما يوفر معدلات تحديث سلسة تصل إلى 60 إطاراً في الثانية.

10.2 بناء دوائر تفاعلية مع أحداث الفأرة ولوحة المفاتيح

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

يتيح هذا النظام البرمجي للمطورين كتابة دوال استجابة (Event Handlers) تتفاعل لحظياً عندما يقوم المستخدم بالنقر على دائرة معينة أو تحريك مؤشر الفأرة فوق مساحتها؛ حيث يمكن استخدام دالة الفحص الهندسي circle.contains(event) لتحديد ما إذا كان إحداثي نقرة الفأرة يقع داخل النطاق المكاني للدائرة، وبالتالي تنفيذ إجراءات مخصصة مثل تغيير لون التعبئة ديناميكياً، أو إظهار نافذة منبثقة تحتوي على معلومات تفصيلية عن النقطة المختارة.

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

11. استكشاف الأخطاء الشائعة واستراتيجيات تصحيحها (Troubleshooting)

11.1 عدم ظهور الدائرة على مساحة الرسم وأسبابه

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

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

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

11.2 أخطاء التنسيق وتداخل التحويلات الإحداثية (Coordinate Transforms)

تُمثل التحويلات الإحداثية (Coordinate Transformations) أحد أعمق المفاهيم المعمارية في Matplotlib، ويؤدي الخلط بين أنظمة الإحداثيات المختلفة إلى تشوهات مكانية وأخطاء جسيمة في موضع وحجم الدوائر المرسومة.

تعتمد الفئة Circle افتراضياً على نظام إحداثيات البيانات (Data Coordinates) المرتبط بالقيم الرقمية للمحاور السينية والصادية؛ ولكن عند تعيين معامل التحويل transform بشكل غير مدروس—مثل ربطه بإحداثيات الشاشة الفيزيائية (Display Coordinates) أو إحداثيات المحور النسبية (Axes Coordinates من 0 إلى 1)—فإن الدائرة ستفقد ارتباطها المكاني بالبيانات وتتحرك أو تتشوه عند تكبير النافذة أو تعديل مقاييس المحاور.

تنشأ أخطاء التنسيق أيضاً عند تصدير المخططات النهائية بصيغ الصور النقطية أو المتجهة (مثل PNG و SVG و PDF) دون تثبيت المعاملات المكانية؛ حيث ينبغي دائماً التأكد من تطبيق ax.set_aspect('equal') قبل التصدير، وضبط معامل التضمين المحكم bbox_inches='tight' في دالة الحفظ plt.savefig() لمنع اقتطاع أجزاء من حواف الدوائر المحيطية الواقعة بالقرب من أطراف اللوحة الرسومية.

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

12.1 دراسة حالة: رسم مناطق التغطية الجغرافية والاتصالات

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

في هذا التطبيق العملي، يتم إسقاط مراكز الأبراج الراديوية على خريطة إحداثية، وتوليد دوائر محيطية بأنصاف أقطار تعكس المدى الترددي وقدرة الإرسال لكل برج بوحدة الكيلومتر أو المتر؛ وباستخدام قيم شفافية لونية مدروسة مثل alpha=0.35، تبرز مناطق التداخل والتغطية المزدوجة (Cell Overlap) كبؤر لونية داكنة تُمكن مهندسي الترددات من تقييم جودة الخدمة وتحديد الثغرات الجغرافية ومناطق انقطاع الإشارة بدقة بصرية متناهية.

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

12.2 دراسة حالة: مخططات فين (Venn Diagrams) والتقاطعات المجموعية

تُمثل مخططات فين (Venn Diagrams) المستخدمة في نظرية المجموعات والإحصاء الحيوي وتحليل البيانات الجينية تطبيقاً رياضياً كلاسيكياً يعتمد كلياً على التموضع النسبي والتقاطع البصري للدوائر الهندسية لإبراز العلاقات المشتركة والمنفصلة بين العينات.

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

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

12.3 أفضل الممارسات لإنتاج رسوم بيانية دائرية قابلة للنشر الأكاديمي

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

تتمثل أولى الممارسات القياسية في ضبط دقة التصيير النقطي عند مستوى لا يقل عن 300 نقطة في البوصة عبر المعامل dpi=300 عند استدعاء plt.savefig()، مما يضمن احتفاظ الدوائر بنعومة حوافها وخلوها التام من التدرجات النقطية المشوهة (Pixelation) عند طباعتها في المجلات الورقية أو تكبيرها على الشاشات عالية الكثافة.

بالإضافة إلى ذلك، يُفضل دائماً تصدير الأشكال البيانية بالصيغ المتجهة القياسية مثل PDF أو EPS أو SVG، والتي تحتفظ بالمعادلات الرياضية للمسارات الدائرية وتسمح بالتحجيم اللانهائي دون أي فقدان للجودة؛ مع الحرص على اختيار خطوط كتابية متوافقة ومقروءة بوضوح (مثل Arial أو Helvetica أو خطوط LaTeX الرياضية)، وتضمين وسوم توضيحية شاملة تحدد وحدات القياس المستخدمة لمراكز وأنصاف أقطار الدوائر لضمان اكتمال القيمة العلمية والتوثيقية للعمل المنشور.

خاتمة

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

References

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

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