تُعد عملية تمثيل البيانات بصرياً (Data Visualization) أحد الركائز الجوهرية في مسار البحث العلمي وتحليل البيانات الحديث؛ إذ لا يقتصر دورها على مجرد تحويل الأرقام المجردة إلى صور، بل يمتد إلى كونها وسيطاً معرفياً ينقل الأنماط والعلاقات المعقدة الكامنة في المصفوفات العددية إلى الإدراك البشري بدقة وكفاءة. وفي هذا السياق، تبرز مكتبة Matplotlib كمعيار قياسي رائد في لغة بايثون لتوليد الرسوم التوضيحية ثنائية وثلاثية الأبعاد بجودة النشر الأكاديمي. ومع تزايد تعقيد البيانات العلمية مثل الحقول الفيزيائية، والخرائط الجغرافية، والشبكات العصبية، تزداد الحاجة إلى إتقان أدوات القياس اللوني، وعلى رأسها شريط الألوان (Colorbar)، الذي يعمل كمسطرة قياس مرجعية تترجم الألوان إلى قيم كمية ذات معنى دلالي ورياضي متين.
على الرغم من البساطة الظاهرية التي توفرها واجهات البرمجة المباشرة لإضافة شريط الألوان، فإن ضبط موضعه، وأبعاده الهندسية، ومحاذاته الدقيقة مع المخطط البياني الأساسي يمثل تحدياً تقنياً متكرراً يواجه المطورين والباحثين على حد سواء. ينشأ هذا التحدي من الطبيعة المعمارية المعقدة لنظام المحاور ومحركات التخطيط داخل مكتبة Matplotlib؛ حيث يؤدي الاستدعاء الافتراضي غالباً إلى استقطاع غير متوازن من مساحة المخطط الأصلي، أو إحداث تشوهات في نسبة العرض إلى الارتفاع (Aspect Ratio)، أو تشويش التوزيع البصري عند التعامل مع مصفوفات الرسوم الفرعية المتعددة (Subplots). إن المعالجة الاحترافية لهذه المعضلات تتطلب فهماً عميقاً للرياضيات الكامنة وراء فضاءات الإحداثيات، وآليات تقسيم المحاور، والتحكم الكائني المتقدم في عناصر الرسم.
يهدف هذا الدليل المرجعي الشامل إلى تفكيك كافة الجوانب النظرية والتطبيقية المرتبطة بالتحكم في موضع وأبعاد شريط الألوان في Matplotlib. سنستعرض عبر هذا البحث المتعمق البنية التحتية الهندسية لمساحات الرسم، ونحلل الاستراتيجيات المختلفة لتموضع الشريط في كافة الاتجاهات (الأسفل، الأعلى، اليسار، واليمين)، كما سنتناول الأدوات المتقدمة مثل حزمة mpl_toolkits.axes_grid1 ومقسمات المحاور، بالإضافة إلى دراسة التنسيق المكاني للوحات المعقدة ومصفوفات المخططات المتعددة. يقدم هذا المقال إطاراً متكاملاً يجمع بين الصرامة الأكاديمية والحلول البرمجية العملية لإنتاج رسوم بيانية ذات دقة فائقة تلبي أعلى معايير النشر العلمي في المجلات المحكمة والمؤسسات البحثية الدولية.
- 1. مقدمة شاملة حول شريط الألوان (Colorbar) في مكتبة Matplotlib
- 2. البنية التحتية والمفاهيم الهندسية لمساحات الرسم في Matplotlib
- 3. الموضع الافتراضي لشريط الألوان واستخدام الدالة الأساسية
- 4. مجموعة أدوات AxesGrid وحزمة make_axes_locatable المتخصصة
- 5. وضع شريط الألوان أسفل المخطط البياني (Bottom Positioning)
- 6. وضع شريط الألوان أعلى المخطط البياني (Top Positioning)
- 7. وضع شريط الألوان على الجانب الأيسر من المخطط (Left Positioning)
- 8. التحكم المتقدم في الأبعاد الهندسية والحشو (Geometry & Padding)
- 9. التحكم في المحاور المخصصة (cax) مقابل معلمات المحاور التلقائية (ax)
- 10. إدارة مواضع أشرطة الألوان في المخططات الفرعية المتعددة (Subplots & Grids)
- 11. التخصيص الجمالي والأسلوبي المتقدم لشريط الألوان وموضعه
- 12. استكشاف الأخطاء الشائعة والحلول المثلى وأفضل الممارسات البرمجية
- خاتمة شاملة وتوصيات منهجية
- المراجع (References)
1. مقدمة شاملة حول شريط الألوان (Colorbar) في مكتبة Matplotlib
1.1 المفهوم الرياضي والدلالي لشريط الألوان في تمثيل البيانات
يمثل شريط الألوان في التحليل البصري اقتراناً رياضياً دالياً يربط بين فضاء البيانات الكمية وفضاء الألوان اللوني. من المنظور الرياضي، يمكن نمذجة هذه العملية كتحويل متصل أو منفصل ينقل قيمة عددية حقيقية $x in [x_{\min}, x_{\max}]$ إلى نقطة معيارية في المجال الأحادي $u in [0, 1]$ عبر دالة التطبيع (Normalization Function)، والتي يُعبّر عنها رياضياً بالصيغة:
$$u = \mathcal{N}(x) = \frac{x – x_{\min}}{x_{\max} – x_{\min}}$$
يعقب ذلك تطبيق دالة خريطة الألوان (Colormap Function) $\mathcal{C}: [0, 1] to \mathbb{R}^4$ التي تسقط القيمة المعيارية $u$ على فضاء لوني رباعي الأبعاد يمثل قنوات الألوان الأساسية ودرجة الشفافية (RGBA: Red, Green, Blue, Alpha). وبناءً على ذلك، فإن شريط الألوان ليس مجرد عنصر تكميلي، بل هو التمثيل البصري العكسي الذي يتيح للقارئ إعادة فك ترميز اللون واسترجاع القيمة الكمية المقابلة $x = \mathcal{N}^{-1}(\mathcal{C}^{-1}(\mathbf{c}))$.
يتطلب هذا الإسقاط البصري توافقاً إدراكياً دقيقاً (Perceptual Uniformity)، حيث يجب أن تتناسب التغيرات في التدرج اللوني بصرياً مع حجم التغير العددي في البيانات. إن استخدام خرائط ألوان غير متوافقة إدراكياً قد يؤدي إلى ظهور حواف وهمية أو إخفاء تباينات حقيقية في البيانات الإحصائية والفيزيائية. من هذا المنطلق، يعمل شريط الألوان كأداة معايرة أساسية تضمن النزاهة العلمية للرسم البياني؛ فهو يحدد بصرياً مجال التباين الكامل، ويوضح طبيعة التوزيع الاحتمالي للبيانات سواء كان توزيعاً خطياً، أو لوغاريتمياً، أو متناظراً حول نقطة حرجة، مما يقلل الغموض التفسيري ويوفر مرجعية قياسية ثابتة لتقييم النتائج المنشورة.
في التطبيقات المعقدة، مثل تمثيل مصفوفات الكثافة، والموجات الكهرومغناطيسية، والتوزيعات المناخية، تتداخل العوامل الإدراكية مع التموضع المكاني لشريط الألوان. إن عدم دقة تموضع الشريط اللوني بالنسبة لمصفوفة البيانات يقطع التدفق البصري للمحلل، مما يرفع من الحمل المعرفي (Cognitive Load) اللازم لتفسير الظاهرة. لذلك، فإن التصميم الرياضي والجمالي لشريط الألوان وموقعه الهندسي يشكلان وحدة وظيفية متكاملة تهدف إلى تعظيم نقل المعلومات الإحصائية بأقل قدر ممكن من التشويه الإدراكي.
1.2 الهيكلية المعمارية لعناصر الرسم في Matplotlib
تقوم مكتبة Matplotlib على معمارية كائنية التوجه (Object-Oriented Architecture) تتبع تسلسلاً هرمياً صارماً لإدارة مساحات العرض والمحاور. في قمة هذا الهرم يقبع كائن الشكل العام (Figure)، والذي يمثل الحاوية الفيزيائية الكلية التي تضم كافة المكونات الرسومية من محاور، ونصوص، وعناوين، ولوحات مساعدة. وتحت هذا الكائن، تأتي كائنات المحاور (Axes)، وهي المناطق المستطيلة الفعلية التي يُرسم بداخلها فضاء البيانات وتحتوي على نظام الإحداثيات، والخطوط، والشبكات، ومحاور التدرج (Ticks).
من الأخطاء المفاهيمية الشائعة الاعتقاد بأن شريط الألوان هو مجرد رسم بياني فرعي ملحق بالمحور الأصلي؛ بينما الحقيقة المعمارية هي أن شريط الألوان في Matplotlib يُبنى بصفته كائناً مستقلاً تماماً من فئة Axes، يمتلك نظام إحداثيات خاص به ومصفوفة تحويلات خطية مستقلة. عندما يتم استدعاء دالة بناء شريط الألوان، تقوم المكتبة بتوليد محور جديد كلياً يُخصص لعرض التدرج اللوني ومقاييس التجزئة المرتبطة به. هذه العلاقة المعمارية تعني أن أي تغيير في موضع أو حجم شريط الألوان يتطلب معالجة تفاعلية بين كائنين مستقلين من كائنات Axes داخل الحاوية الكبرى Figure.
تتم إدارة المساحة الافتراضية داخل كائن Figure عبر شبكة إحداثيات معيارية تمتد من النقطة $(0, 0)$ في الزاوية السفلية اليسرى إلى النقطة $(1, 1)$ في الزاوية العلوية اليمنى. عند إضافة شريط ألوان بالطرق المباشرة، يتدخل مدير التخطيط الافتراضي لاقتطاع جزء من المساحة المخصصة للمحور الأصلي وإعادة حساب مصفوفة التحويل المكاني لتوفير حيز للمحور الجديد الخاص بشريط الألوان. هذا السلوك الافتراضي هو السبب الجذري في تقلص المخطط الأصلي وتغير نسب أبعاده الهندسية، مما يفرض ضرورة استخدام أساليب برمجية وهندسية متقدمة للتحكم في هذا التوزيع المعماري.
1.3 حالات الاستخدام الأكاديمية والتطبيقية لتخصيص المواضع
تتنوع متطلبات التموضع المكاني لشريط الألوان بتنوع السياقات العلمية والتطبيقية؛ ففي المجلات الأكاديمية المحكمة ذات التنسيق ثنائي الأعمدة (Double-column formats)، مثل منشورات IEEE وNature وElsevier، تكون المساحة الأفقية مقيدة بشدة، مما يجعل وضع شريط الألوان على الجانب الأيمن للمخطط سبباً في ضغط المخطط الأساسي وجعل تفاصيله الدقيقة غير قابلة للقراءة. في مثل هذه الحالات، تقتضي أفضل الممارسات نقل شريط الألوان إلى الأسفل أو الأعلى بتوجيه أفقي لتوفير المساحة العرضية والحفاظ على الدقة المكانية للمخطط.
تظهر الحاجة الماسة لضبط المواضع أيضاً عند التعامل مع المصفوفات الحرارية (Heatmaps) ذات النسب المتساوية (Square Aspect Ratio)، كما في مصفوفات الارتباط الجيني أو مصفوفات التغاير الإحصائي. إذا تم إلحاق شريط الألوان بالطريقة التقليدية، فإن المحور الأصلي ينكمش أفقياً فقط، مما يدمر التناظر المربع للبيانات. يتيح التخصيص الهندسي الدقيق لموضع وحجم شريط الألوان الحفاظ على التطابق المورفولوجي للخلايا الحرارية وضمان محاذاة حواف الشريط بشكل متطابق مع بداية ونهاية مصفوفة البيانات.
علاوة على ذلك، تواجه لوحات القياس التحليلية والمخططات متعددة الأبعاد (Multipanel Figures) تحدي التنافر البصري الناتج عن تكرار أشرطة الألوان لكل رسم فرعي. يتطلب التصميم الاحترافي في هذه السيناريوهات بناء شريط ألوان مركزي موحد، يتموضع بدقة في موقع استراتيجي (مثل المنتصف بين اللوحات أو في محاذاة أفقية سفلية تشمل كافة الأعمدة)، مما يزيل التكرار، ويوحد النطاق الديناميكي للمقارنة الإحصائية، ويمنع أي تداخل بصري مع شروحات المحاور وعناوين اللوحات الفرعية.
2. البنية التحتية والمفاهيم الهندسية لمساحات الرسم في Matplotlib
2.1 نظام الإحداثيات النسبي والمطلق (Coordinates Systems)
تعتمد مكتبة Matplotlib على نظام متعدد المستويات لإدارة التحويلات الهندسية ونظم الإحداثيات (Transformations Framework). إن فهم هذه النظم يعد المدخل الأساسي للتحكم المطلق في تموضع شريط الألوان. يتكون هذا الإطار من أربعة فضاءات إحداثية رئيسية تعمل بتسلسل متدرج: فضاء البيانات (Data Coordinates)، وفضاء المحور (Axes Coordinates)، وفضاء الشكل (Figure Coordinates)، وفضاء العرض الفيزيائي (Display Coordinates).
يحدد فضاء المحور (Axes Coordinates) المواضع بنسب تمتد من $(0,0)$ إلى $(1,1)$ داخل مستطيل المحور المحدد، وهو نظام مستقل تماماً عن القيم العددية للبيانات المعروضة. بالمقابل، يمتد فضاء الشكل (Figure Coordinates) عبر كامل مساحة النافذة الرسومية من $(0,0)$ في أقصى القاع الأيسر إلى $(1,1)$ في أقصى القمة اليمنى للشكل ككل. عندما نقوم بإنشاء محور مخصص لشريط الألوان، فإننا نحدد موقعه إما برمجياً عبر فضاء الشكل لتثبيته في موضع مطلق، أو عبر فضاء المحور لربطه بمحاذاة هندسية نسبية للمخطط الأصلي. يتم تحويل هذه الإحداثيات النسبية إلى فضاء العرض الفيزيائي (المقاس بالبكسل) عبر مصفوفة تحويل تآلفية (Affine Transformation Matrix) ترتبط مباشرة بكثافة النقاط في البوصة (DPI: Dots Per Inch).
يلعب معامل DPI دوراً حاسماً في استقرار الموضع الهندسي؛ فعند تغيير دقة العرض لتصدير المخطط بجودة طباعية عالية (مثل 300 أو 600 DPI)، تتغير المقاسات الفيزيائية بالبكسل للنصوص وهوامش المحاور وعلامات التجزئة. إذا لم تكن مواضع أشرطة الألوان مبنية على محولات نسبية متينة أو مقسمات محاور ديناميكية، فإن هذا التحويل قد يتسبب في انزياح شريط الألوان أو تداخله مع التسميات المحاذية، مما يؤكد أهمية الاعتماد على النظم الهندسية المتكيفة بدلاً من الإحداثيات الثابتة الصلبة.
2.2 آلية عمل محركات التخطيط (Layout Engines)
شهدت الإصدارات الحديثة من Matplotlib تطوراً جوهرياً في محركات التخطيط الآلي، والتي تهدف إلى إدارة المساحات البيضاء وتفادي تداخل النصوص وعناصر الرسوم تلقائياً. المحركان الرئيسيان هما محرك التخطيط المحكم (Tight Layout) ومحرك التخطيط المقيد الحديث (Constrained Layout). يعمل كلا المحركين كخوارزميات استمثال هندسي تحسب الصناديق المحيطة (Bounding Boxes) لكافة عناصر الرسم وتعدل مواضع المحاور ديناميكياً لتفادي التداخل.
تختلف استجابة شريط الألوان جذرياً تبعاً للمحرك المستخدم. عند تطبيق محرك tight_layout، يتم تقييم المساحة المشغولة بشريط الألوان كعنصر مستقل، ويقوم المحرك بضغط المحاور المجاورة لتوفير المساحة، إلا أن هذا المحرك يعاني من قيود هيكلية عند استخدام مقسمات المحاور المتخصصة أو المحاور المضافة يدوياً عبر fig.add_axes، مما قد ينتج عنه تحذيرات برمجية وتجاهل لتعديلات الموضع. في المقابل، يمثل محرك constrained_layout حلاً معمارياً متقدماً يعتمد على حل المعادلات التوافقية للمساحات؛ فهو يدمج شريط الألوان ضمن الهيكل الشبكي الأصلي للرسم، ويحافظ على النسب الهندسية الدقيقة حتى عند إضافة أشرطة متعددة أو تغيير أبعاد النافذة.
إن استيعاب سلوك محرك التخطيط المعتمد في بيئة العمل يحدد استراتيجية البرمجة الواجب اتباعها. ففي حال الرغبة بالتحكم اليدوي المطلق في الموضع والمسافات الفاصلة بدقة الميكرومتر، يفضل تعطيل محركات التخطيط التلقائي أو استخدام مصفوفات التقسيم الهندسية التابعة لحزمة axes_grid1 التي تعمل في طبقة وسيطة تضمن التنسيق الدقيق دون الاعتماد على خوارزميات الاستمثال التلقائية التي قد تغير النتائج بشكل غير متوقع.
2.3 التفاعل بين كائن ScalarMappable والمحاور
في قلب منظومة توليد الألوان في Matplotlib يقبع الكائن المجرد ScalarMappable. لا يمثل هذا الكائن رسماً بيانياً بحد ذاته، بل هو بروتوكول برمجي يجمع بين خريطة الألوان المحددة (Colormap) وكائن التطبيع الرياضي (Normalize). كافة التوابع الرسومية التي تنتج بيانات ملونة مثل imshow، وpcolormesh، وcontourf، وscatter تعيد كائنات ترث أو تطبق خصائص ScalarMappable.
عند إنشاء شريط الألوان، تتطلب دالة البناء تمرير هذا الكائن كوسيط إلزامي لكي يتمكن شريط الألوان من استخراج المدى الإحصائي الأدنى والأقصى للبيانات ($v_{\min}, v_{\max}$)، والتعرف على طبيعة دالة التحويل (خطية، لوغاريتمية، أو مخصصة)، واستخلاص جدول الألوان الدقيق. بعد ذلك، يقوم شريط الألوان برسم التدرج اللوني داخل المحور المخصص له، وإنشاء محاذاة متطابقة تماماً بين التدريجات الرقمية المعروضة على حافة الشريط والمجال الإحصائي للرسم الأساسي.
تتجلى قوة هذا الفصل المعماري عند الرغبة في إنشاء شريط ألوان مستقل لا يرتبط مباشرة بمخطط بياني وحيد، أو عند الحاجة إلى توحيد شريط ألوان عبر عدة محاور بيانات منفصلة. في هذه الحالات، يمكن للمطور إنشاء كائن ScalarMappable اصطناعي وتزويده بالمدى اللوني المطلوب وخريطة الألوان، ثم ربطه بالمحور المخصص لشريط الألوان دون الحاجة لرسم بيانات مسبقة في المحور الأساسي، مما يوفر مرونة هندسية وبرمجية غير محدودة في بناء واجهات البيانات المعقدة.
3. الموضع الافتراضي لشريط الألوان واستخدام الدالة الأساسية
3.1 التموضع الافتراضي على الجانب الأيمن وتحليله الميكانيكي
عند استدعاء الدالة القياسية plt.colorbar() أو التابع الكائني fig.colorbar(mappable, ax=ax) دون تمرير معلمات موضعية متقدمة، تقوم المكتبة بتنفيذ إجراء افتراضي يتمثل في وضع شريط الألوان رأسياً على الجانب الأيمن من المحور المرجعي المحدد. ميكانيكياً، تعتمد هذه العملية على قياس الصندوق المحيط الحالي للمحور ax، ثم اقتطاع شريحة طولية من عرضه الإجمالي لإفساح المجال لإنشاء المحور الجديد الحاضن للشريط اللوني.

يتسبب هذا الاقتطاع التلقائي في ظاهرة معروفة تسمى “انكماش المحور” (Axes Shrinkage)؛ حيث يتم تقليص العرض الأفقي للمخطط الأصلي بنسبة محددة سلفاً لضمان بقاء كلا الكائنين داخل الحدود الخارجية للشكل. على الرغم من أن هذا السلوك يوفر وسيلة سريعة ومريحة لإنتاج الرسوم البيانية الاستكشافية، إلا أنه يمثل عائقاً تصميمياً كبيراً في التطبيقات الاحترافية، لا سيما عندما يحتوي الرسم على عناصر تتطلب مقياساً هندسياً ثابتاً، مثل الخرائط الجغرافية والمسوحات المساحية، حيث يؤدي تقليص العرض إلى تشويه نسب التمثيل المكاني للأجسام المعروضة.
يتم التحكم في هذا السلوك الافتراضي عبر مجموعة من المعلمات الضمنية في الدالة، مثل fraction (التي تحدد نسبة المساحة المستقطعة من المحور الأصلي، وقيمتها الافتراضية 0.15)، وpad (المسافة الفاصلة بين المخطط وشريط الألوان، وقيمتها الافتراضية 0.05). وعلى الرغم من إمكانية تعديل هذه المعلمات لتخفيف حدة الانكماش، إلا أن الطبيعة الاستقطاعية للمحور تظل قائمة ما لم يتم الانتقال إلى استخدام محاور مخصصة صريحة.
3.2 المحددات والقيود في الاستخدام المباشر للدوال الافتراضية
تنطوي الحلول القائمة على الاستدعاء المباشر للدوال الافتراضية على عدة محددات هندسية تحد من ملاءمتها للنشر العلمي المتقدم. أول هذه المحددات هو الفشل في محاذاة ارتفاع شريط الألوان مع ارتفاع المخطط البياني في حال تم فرض نسبة أبعاد متساوية (aspect='equal'). في مثل هذه السيناريوهات، ينكمش ارتفاع المحور الفعلي ليتطابق مع البيانات، بينما يستمر شريط الألوان الافتراضي في التمدد ليشغل كامل الارتفاع المتاح للمحور النظري، مما يولد تفاوتاً بصرياً فجاً يظهر فيه شريط الألوان أطول أو أقصر من المخطط المجاور له.
المحدد الثاني يتعلق بالتحكم في الرسوم الفرعية المتعددة (Subplots)؛ فعند محاولة إضافة شريط ألوان افتراضي لكل لوحة فرعية داخل شبكة رسومية ($N \times M$)، يؤدي التفاوت في اقتطاع المساحات إلى جعل أعمدة الشبكة غير متساوية في العرض، مما يفقد المصفوفة تناسقها الهندسي ويجعل مقارنة المنحنيات والمصفوفات بين اللوحات أمراً مضللاً بصرياً وصعب التحليل.
أما المحدد الثالث فيتمثل في صعوبة إدارة التداخلات بين نصوص شريط الألوان (كتسميات التدريج وعناوين المقاييس) وعناصر المخطط الأخرى، مثل تسميات المحور الصادي للمخططات المجاورة. ونظراً لأن التموضع الافتراضي لا يمتلك معرفة سياقية بمحتوى المخططات المجاورة، فإنه غالباً ما يتطلب تدخلاً يدوياً مكثفاً وإعادة ضبط متكررة للمسافات البينية لتجنب تداخل النصوص عند تغيير دقة الإخراج أو نوع الخط المستخدم.
3.3 إعادة إنتاج الأمثلة الأساسية بطريقة قابلة للتكرار (Reproducibility)
لضمان الصرامة العلمية وقابلية تكرار التجارب البرمجية الموضحة في هذا الدليل، يجب اعتماد بروتوكول معياري لتوليد مصفوفات البيانات الاختبارية. يتم ذلك من خلال تثبيت البذرة العشوائية (Random Seed) لمولد الأرقام في مكتبة NumPy، مما يضمن الحصول على نفس التوزيعات الإحصائية والخرائط اللونية في كل مرة يتم فيها تنفيذ الكود عبر مختلف البيئات والمنصات الحوسبية.
يتضمن النموذج البرمجي المعياري استيراد المكتبات الأساسية (matplotlib.pyplot و numpy)، وتوليد حقل بيانات ثنائي الأبعاد مستمر، مثل دالة غاوسية ثنائية المتغير أو شبكة قياس عشوائية ملساء، واستخدام دالة imshow أو pcolormesh لتمثيل هذا الحقل، تليها معالجة كائن ScalarMappable الناتج عبر دالة بناء شريط الألوان المرجعية. يوفر هذا الإجراء أرضية موحدة تتيح لنا مقارنة تأثيرات التموضع بدقة وملاحظة الفروق الدقيقة الناتجة عن كل تقنية برمجية سيتم استعراضها لاحقاً.
إن بناء كود تجريبي منظم وواضح لا يسهم فقط في سهولة المتابعة، بل يمثل حجر الزاوية في بناء مكتبات وأدوات برمجية مخصصة قابلة لإعادة الاستخدام داخل المجموعات البحثية والمشاريع الصناعية الكبرى، حيث تصبح عمليات الرسم البياني جزءاً من أنابيب معالجة البيانات الآلية (Data Pipelines) التي تتطلب استقراراً بصرياً تاماً بغض النظر عن طبيعة البيانات المدخلة.
4. مجموعة أدوات AxesGrid وحزمة make_axes_locatable المتخصصة
4.1 مدخل إلى حزمة mpl_toolkits.axes_grid1
تمثل حزمة mpl_toolkits.axes_grid1 إحدى أقوى الأدوات الهندسية المتوفرة ضمن منظومة Matplotlib لتجاوز قيود التخطيط الافتراضي. صُممت هذه المكتبة المتخصصة بهدف تزويد المطورين والباحثين بآليات تحكم دقيقة في الأبعاد الهندسية للمحاور ومحاذاة الرسوم الملحقة دون المساس بالنسب الأصلية للمخططات الأساسية.
تقوم الفلسفة التصميمية لحزمة axes_grid1 على مفهوم “تقسيم المحور” (Axes Dividing) بدلاً من إنشاء محاور عائمة أو استقطاع مساحات غير منضبطة. بدلاً من معاملة شريط الألوان ككائن مستقل يتم إسقاطه عشوائياً في مساحة الشكل، توفر هذه الحزمة روابط ميكانيكية متينة تربط بين المحور الأصلي ومحور شريط الألوان، بحيث تظل أبعاد شريط الألوان مقفلة رياضياً ومتزامنة تماماً مع أبعاد المحور المصدري مهما تغيرت أبعاد النافذة أو نسبة العرض إلى الارتفاع للبيانات.
تعد هذه الحزمة المعيار الذهبي في المجالات العلمية التي تتطلب رسوماً متساوية الأبعاد الهندسية (Isotropic Plots)، مثل التصوير المقطعي الطبي، والفلك، والفيزياء النووية؛ إذ تتيح هذه الأدوات إضافة أشرطة الألوان، وخرائط التباين، والرسوم الهامشية (Marginal Plots) مع ضمان بقاء مقياس الرسم الفيزيائي ثابتاً ومحمياً من أي تشوه مكاني.
4.2 طريقة عمل مقسم المحاور (Axes Divider)
تعد دالة make_axes_locatable المدخل الأساسي لاستخدام هذه المنظومة المتقدمة. عند تمرير محور قائم ax إلى هذه الدالة، تقوم بإنشاء وتغليف المحور داخل كائن وسيط يُعرف بمقسم المحاور (AxesDivider). يعمل هذا المقسم كمدير هندسي محلي يتحكم في المنطقة المستطيلة المخصصة للمحور الأصلي داخل الشكل.
تتمثل الوظيفة الجوهرية لمقسم المحاور في القدرة على تجزئة المساحة المحددة إلى قطاعات فرعية متجاورة بدقة متناهية. بدلاً من تقليص المحور الأساسي بشكل عشوائي، يقوم المقسم باقتطاع جزء مدروس من المساحة الهامشية الملاصقة للمحور، مع الحفاظ الصارم على نسبة الارتفاع إلى العرض للمخطط الأساسي. يتميز مقسم المحاور بقدرته على حساب وتحديث هذه القياسات لحظياً أثناء مرحلة التصيير (Rendering Phase)، مما يضمن عدم حدوث أي انفصال بصري بين شريط الألوان والمخطط الأصلي.
إلى جانب ذلك، يقوم مقسم المحاور بمزامنة التحولات الموضعية؛ فإذا تم نقل المخطط الأصلي أو تعديل هوامشه، يتحرك محور شريط الألوان الملحق تلقائياً وبشكل متزامن، مما يقضي تماماً على مشاكل التداخل والانزياح التي تنشأ عادة عند التعامل مع النوافذ التفاعلية أو عند إعادة تحجيم الرسوم البرمجية لتناسب مقاسات العرض المختلفة.
4.3 الدوال الأساسية لتوليد المحاور المساعدة
يوفر كائن مقسم المحاور مجموعة من التوابع البرمجية فائقة المرونة لتوليد محاور جديدة في أي اتجاه فراغي محيط بالمحور الأصلي. التابع الأكثر استخداماً هو append_axes(position, size, pad)، والذي يستقبل ثلاثة معلمات رئيسية تحدد السلوك الهندسي للمحور الجديد:
- الموضع (position): يحدد الجهة الجغرافية لإلحاق المحور الجديد بالنسبة للمحور الأصلي، ويقبل إحدى القيم النصية:
'right'،'left'،'top'، أو'bottom'. - الحجم (size): يحدد سمك المحور الملحق، ويمكن التعبير عنه كنسبة مئوية نصية من أبعاد المحور الأصلي (مثل
'5%') أو كقيمة مطلقة بوحدات محددة، مما يمنح المطور تحكماً كاملاً في رشاقة شريط الألوان. - الحشو (pad): يحدد المسافة الفاصلة بدقة بين حافة المخطط الأصلي وحافة المحور الجديد، ويمكن أيضاً تحديده بنسبة مئوية (مثل
'2%'أو'0.1'بوصة) لتجنب التلاصق غير المرغوب فيه.
بالإضافة إلى append_axes، يوفر المقسم دوالاً أكثر تخصصاً مثل new_vertical وnew_horizontal للتحكم الحركي الدقيق وبناء هياكل تكديس معقدة للمحاور المساعدة، مع إمكانية استخدام المعلمة المنطقية pack_start للتحكم في الترتيب الهيكلي لإضافة المحاور عند الرغبة في وضع شريط الألوان في الجهات المتقدمة كالأعلى واليسار.
5. وضع شريط الألوان أسفل المخطط البياني (Bottom Positioning)
5.1 التطبيق البرمجي عبر new_vertical مع التوجيه الأفقي
يمثل وضع شريط الألوان أسفل المخطط البياني خياراً تصميمياً استراتيجياً في الأوراق البحثية التي تفرض قيوداً صارمة على العرض الأفقي للمخطط، أو عند التعامل مع مصفوفات بيانات تمتد أفقياً على مساحة عريضة. لتطبيق هذا التموضع باستخدام أدوات axes_grid1، يتم استخدام دالة التقسيم الرأسي لإنشاء محور سفلي متكامل يتطابق عرضه تماماً مع عرض المخطط الأصلي.

برمجياً، يتم تمرير المحور الأصلي إلى دالة make_axes_locatable لإنشاء المقسم، ثم يُستدعى التابع append_axes("bottom", size="5%", pad=0.5) أو استخدام new_vertical مع تفعيل الخيار pack_start=True لضمان توجيه المحور الجديد نحو الحافة السفلية القصوى للمخطط. بعد تخصيص المحور السفلي (الذي يُصطلح على تسميته عادة بـ cax)، يتم استدعاء دالة بناء شريط الألوان مع تحديد الاتجاه الأفقي بوضوح عبر تمرير المعلمة orientation='horizontal':
fig.colorbar(im, cax=cax, orientation='horizontal')
يضمن هذا الإجراء أن يمتد التدرج اللوني من اليسار إلى اليمين بالتوازي مع المحور السيني للمخطط، مع الحفاظ على تطابق هندسي كامل بين الحافة اليسرى لشريط الألوان والحافة اليسرى للمخطط، وكذلك بالنسبة للحواف اليمنى، مما يضفي اتساقاً وتناغماً بصرياً فائقاً يرفع من الجودة الجمالية والوظيفية للشكل النهائي.
5.2 معالجة التباعد والحشو السفلي (Pad Adjustment)
ينطوي وضع شريط الألوان في الأسفل على تحدٍ تقني يتعلق بالمساحة الفاصلة والحشو (Padding)؛ نظراً لأن الحافة السفلية للمخطط الأصلي تحتوي عادة على أرقام علامات التدريج (Tick Labels) وعنوان المحور السيني ($X\text{-axis label}$). في حال ضبط قيمة حشو منخفضة جداً، سيحدث تداخل مباشر وتشويش بصري بين نصوص المحور السيني وشريط الألوان.
لحل هذه المعضلة بدقة رياضية، يجب حساب قيمة pad في دالة التقسيم لتكون مساوية على الأقل لارتفاع الصندوق المحيط بنصوص وتسميات المحور السيني مقاساً بوحدات المحور. يمكن التعبير عن هذا الحشو بنسبة مئوية مريحة (مثل pad="12%" إلى pad="18%") أو بقيم عددية عائمة تتناسب مع حجم الخط المستخدم (Font Size). يتيح هذا التباعد المدروس إبقاء تسميات المخطط الأساسي واضحة تماماً ومقروءة دون أن يفقد شريط الألوان اتصاله الدلالي بالمخطط.
من الممارسات المتقدمة أيضاً مراعاة الحافة السفلية الكلية للشكل (Figure Bottom Margin)؛ حيث يؤدي إضافة المحور السفلي مع الحشو المطلوب إلى دفع عناصر الرسم نحو القاع، مما قد يتسبب في اقتطاع الأرقام السفلية لشريط الألوان نفسه عند حفظ الصورة. يمكن معالجة ذلك بسهولة عبر استخدام plt.subplots_adjust(bottom=0.2) أو ضبط معلمات محرك التخطيط لضمان استيعاب كافة العناصر داخل الإطار الفيزيائي للملف المصدّر.
5.3 تخصيص العلامات والتسميات على الشريط الأفقي
عند تحويل شريط الألوان إلى الاتجاه الأفقي، تنتقل مقاييس التدريج والعلامات الرقمية افتراضياً إلى الحافة السفلية لشريط الألوان. في بعض السياقات التصميمية المتقدمة، قد يرغب الباحث في نقل هذه العلامات إلى الحافة العلوية للشريط أو ضبط كثافتها وتوزيعها لمنع تداخل القيم الرقمية عند تقاربها.
يمكن إدارة هذا التخصيص عبر واجهة برمجة كائن شريط الألوان؛ حيث يتيح التابع cbar.ax.xaxis.set_ticks_position('bottom') أو 'top' تحديد موضع التدريج بدقة متناهية. بالإضافة إلى ذلك، يمكن استخدام التابع cbar.set_label('الوصف الدلالي للمتغير', labelpad=10) لإضافة عنوان وصفي للقيم المعروضة ووحدات قياسها الفيزيائية، وتحديد موقع هذا العنوان سواء كان متمركزاً في المنتصف أسفل الشريط أو عند طرفه الأيمن.
في حالات السلاسل الزمنية أو البيانات ذات القيم الرقمية الطويلة، يُنصح بتدوير نصوص التدريج بزاوية خفيفة (مثل 45 درجة) عبر استدعاء plt.setp(cbar.ax.get_xticklabels(), rotation=45, ha='right')، أو تطبيق منسقات الأرقام العلمية (Tick Formatters) لتقليص طول النصوص وضمان مظهر احترافي خالٍ من الفوضى البصرية.
6. وضع شريط الألوان أعلى المخطط البياني (Top Positioning)
6.1 التطبيق البرمجي للوضع العلوي وتعديل التوزيع الرأسي
يعد وضع شريط الألوان أعلى المخطط البياني أحد الأنماط التصميمية الحديثة المتبعة في لوحات التحكم المتقدمة والخرائط الجغرافية والمسوحات الكنتورية، حيث يتيح هذا التموضع للقارئ استيعاب المقياس اللوني ونطاق القيم قبل الشروع في فحص تفاصيل البيانات أثناء مسح الرسم من الأعلى إلى الأسفل وفق حركة العين الطبيعية.

لتطبيق هذا النمط باستخدام مقسم المحاور، يتم استخدام الدالة append_axes("top", size="5%", pad=0.3). يقوم هذا التابع بإنشاء محور أفقي ملحق أعلى الحافة العليا للمخطط الأصلي مباشرة. يتم بعد ذلك ربط كائن ScalarMappable بهذا المحور العلوي مع تحديد الاتجاه الأفقي orientation='horizontal':
cax = divider.append_axes("top", size="6%", pad=0.4)
cbar = fig.colorbar(im, cax=cax, orientation='horizontal')
لتحقيق أعلى درجات الأناقة التصميمية، يفضل نقل تدريجات وأرقام شريط الألوان لتكون أعلى الشريط وليس أسفله، حتى لا تتداخل مع الحافة العليا للمخطط البياني. يتم ذلك برمجياً عبر استدعاء cax.xaxis.set_ticks_position('top') وتوجيه العنوان الوصفي ليتموضع أعلى الأرقام عبر cax.xaxis.set_label_position('top')، مما يخلق وحدة بصرية متناسقة تؤطر المخطط من الأعلى بأسلوب احترافي متقن.
6.2 حل نزاعات التداخل مع عنوان الرسم (Figure Title)
يمثل التداخل المكاني بين شريط الألوان العلوي وعنوان المخطط البياني (Plot Title) أحد أكثر التحديات شيوعاً عند اعتماد هذا النمط. افتراضياً، يوضع عنوان المخطط عبر دالة ax.set_title() مباشرة فوق الحافة العليا للمحور الأساسي، وهو نفس الحيز المكاني الذي سيشغله شريط الألوان الجديد، مما يؤدي إلى تصادم وتطابق غير مقبول بين النصوص والتدرج اللوني.
لتجاوز هذا النزاع الهندسي، تتوفر استراتيجيتان برمجيتان رئيسيتان:
- الاستراتيجية الأولى: نقل العنوان إلى شريط الألوان نفسه؛ بدلاً من تعيين عنوان للمحور الأصلي، يتم تعيين العنوان لشريط الألوان العلوي عبر
cax.set_title('عنوان المخطط والبيانات', pad=15). وبذلك يرتفع العنوان تلقائياً ليعلو شريط الألوان ويحتفظ بوظيفته الوصفية للمخطط ككل. - الاستراتيجية الثانية: الإزاحة الرأسية الصريحة لعنوان المحور؛ إذا كان من الضروري بقاء العنوان مرتبطاً بالمحور الأصلي، يتم استخدام المعلمة
yفي دالةset_titleلرفع موضع العنوان رأسياً (مثال:ax.set_title('العنوان', y=1.25))، مع معايرة قيمة الإزاحة لتتجاوز الارتفاع الإجمالي لشريط الألوان وهوامش الحشو المرافقة له.
تضمن هذه المعالجة الهندسية الواعية الفصل البصري التام بين البيانات وعناوينها وشريط القياس، مما يحافظ على التراتبية الهرمية لعناصر العرض الرسومي ويوفر تجربة قراءة مريحة ودقيقة للمتلقي.
6.3 حالات الاستخدام المثالية للشريط العلوي
يتفوق شريط الألوان العلوي في السيناريوهات التي يكون فيها المحور السيني السفلي مزدحماً للغاية بالبيانات والتسميات؛ مثل مخططات السلاسل الزمنية التفصيلية التي تحتوي على تواريخ بتنسيقات متعددة الأسطر، أو المخططات الجينية التي تحتوي على مئات التسميات للمواقع الكروموسومية. في هذه البيئات المزدحمة، يؤدي وضع شريط الألوان في الأسفل أو الجوانب إلى تعقيد المشهد البصري، بينما يوفر الموضع العلوي حيزاً هادئاً وخالياً من التعارضات النصية.
تستفيد الخرائط الجغرافية والجيوفيزيائية (GIS Plots) بشكل خاص من التموضع العلوي؛ إذ غالباً ما تحتوي الخرائط على شروحات خطوط الطول في الأسفل ومقاييس الرسم الجغرافي (Scale Bars) في إحدى الزوايا السفلية. يوفر الشريط العلوي في هذه الحالة منصة مثالية لعرض مقياس الارتفاعات الطبوغرافية أو درجات الحرارة السطحية دون التشويش على تفاصيل الإحداثيات الجغرافية الأساسية.
بالإضافة إلى ذلك، يُفضل استخدام الشريط العلوي في لوحات العرض الموجهة للمدراء ومتخذي القرار (Executive Dashboards)، حيث تتطلب قواعد تصميم تجربة المستخدم التركيز الفوري على مؤشرات الأداء ومجالات التقييم اللوني (مثل نطاقات الخطر والأمان) في الجزء العلوي من الشاشة قبل الغوص في تفاصيل الرسوم البيانية التحتية.
7. وضع شريط الألوان على الجانب الأيسر من المخطط (Left Positioning)
7.1 التطبيق البرمجي عبر new_horizontal على الجانب الأيسر
على الرغم من أن التموضع الأيمن هو الأكثر شيوعاً تاريخياً، إلا أن وضع شريط الألوان على الجانب الأيسر من المخطط يمثل خياراً تقنياً وبصرياً ذا أهمية كبرى في سياقات لغوية وتصميمية محددة. يتيح هذا النمط مواءمة التدفق البصري في البيئات التي تقرأ من اليمين إلى اليسار، أو في المخططات التي تتطلب إبراز شريط القياس كنقطة ارتكاز أولية قبل قراءة البيانات المعقدة الممتدة نحو اليمين.
لتطبيق هذا التموضع برمجياً، يتم استخدام دالة التقسيم الأفقي مع توجيه المحور الجديد نحو الحافة اليسرى. يتم ذلك عبر استدعاء divider.append_axes("left", size="5%", pad=0.6) أو استخدام التابع new_horizontal(size="5%", pad=0.6, pack_start=True) وإضافته إلى الشكل عبر fig.add_axes(cax). يضمن تمرير المعلمة pack_start=True إزاحة المحور الجديد ليتموضع تماماً إلى يسار المحور الأصلي بدلاً من التداخل معه.
بعد إنشاء المحور الأيسر، يتم إنشاء شريط الألوان بالاتجاه الرأسي الافتراضي orientation='vertical'. ولكي يكتمل التناسق الجمالي، يجب توجيه علامات التدريج والتسميات الرقمية لتكون على الحافة اليسرى لشريط الألوان (جهة الخارج) بدلاً من الحافة اليمنى الملاصقة للمخطط، ويتم ذلك عبر استدعاء cax.yaxis.set_ticks_position('left') وcax.yaxis.set_label_position('left')، مما يمنح الشريط مظهراً خارجياً مستقلاً وأنيقاً.
7.2 إدارة محاذاة محور الصادات (Y-axis) وتسمياته
يتطلب التموضع الأيسر معالجة دقيقة للمسافات البينية لتجنب التداخل الحرج مع تسميات وعلامات محور الصادات للمخطط الأصلي ($Y\text{-axis labels}$). في التخطيط الافتراضي، تقع أرقام وتسميات محور الصادات على الحافة اليسرى للمخطط، وبالتالي فإن وضع شريط الألوان في تلك المنطقة قد يؤدي إلى سحقه لتلك التسميات ما لم يتم تعديل الحشو الهندسي بعناية فائقة.
تتم معالجة هذه المسألة من خلال مضاعفة قيمة المعلمة pad في دالة التقسيم (لتصل مثلاً إلى pad=0.8 أو pad=1.0 بوصة) لتوفير حيز كافٍ يستوعب أرقام محور الصادات وتسميته النصية. كبديل تصميمي أكثر تقدماً وأناقة، يمكن نقل تسميات وعلامات محور الصادات للمخطط الأساسي بالكامل إلى الحافة اليمنى عبر استدعاء ax.yaxis.tick_right() وax.yaxis.set_label_position('right').
عند نقل تسميات المحور الصادي إلى اليمين، يصبح الجانب الأيسر مخصصاً بالكامل وبشكل نقي لشريط الألوان، مما يقضي على أي احتمالية لتداخل النصوص، ويحقق توازناً بصرياً ممتعاً تتوزع فيه الشروحات المرجعية على طرفي المخطط البياني بتناغم تام.
7.3 المقارنة البصرية بين الوضع الأيمن والأيسر
تكشف دراسات التتبع البصري (Eye-Tracking Studies) في مجال التفاعل بين الإنسان والحاسوب وتحليل البيانات أن حركة العين تتبع أنماطاً إدراكية تتأثر بشدة باللغة الأم للمحلل وطبيعة المهمة التحليلية. في المجتمعات والوثائق المكتوبة باللغة العربية (من اليمين إلى اليسار)، يميل المسح البصري الأولي إلى البدء من الجانب الأيمن، مما يجعل وضع شريط الألوان على اليسار بمثابة المحطة الختامية الطبيعية لتفسير البيانات بعد مسح المخطط، والعكس صحيح في البيئات الغربية.
من الناحية التركيبية، يساهم التموضع الأيسر في تعزيز التوازن البصري للمخططات غير المتناظرة؛ فعندما يحتوي المخطط الأساسي على تكتل بصري أو كثافة بيانات عالية في النصف الأيمن، يؤدي وضع شريط الألوان على الجانب الأيسر إلى إعادة توزيع الوزن البصري (Visual Weight) بالتساوي عبر اللوحة، مما يمنع انحياز الانتباه نحو جانب دون الآخر.
يوضح الجدول التحليلي التالي مقارنة شاملة بين خصائص التموضع الأيمن والأيسر لمساعدة الباحث على اختيار الموضع الأمثل لسياق النشر المستهدف:
- التموضع الأيمن (Right Position): المعيار القياسي الافتراضي؛ مثالي للأوراق باللغة الإنجليزية والمخططات المفردة؛ يتطلب حشواً بسيطاً؛ عيبه الأساسي هو استقطاع المساحة العرضية وتقليص حجم المخطط.
- التموضع الأيسر (Left Position): مثالي للمنشورات العربية وتصاميم لوحات المعلومات المتوازنة؛ يوفر مرونة عند نقل علامات المحور الصادي لليمين؛ يتطلب معايرة دقيقة للحشو لتجنب التصادم مع تسميات المحور الصادي الأصلي.
8. التحكم المتقدم في الأبعاد الهندسية والحشو (Geometry & Padding)
8.1 التحكم في سمك الشريط وحجمه بالنسبة للمخطط (Size & Fraction)
يعد التحكم في النسبة التناسبية لسمك شريط الألوان مقارنة بالمخطط الأساسي أحد أهم عوامل الاحترافية التصميمية في الإخراج النهائي. إن أشرطة الألوان شديدة السماكة تهيمن بصرياً على الرسم وتشتت انتباه القارئ عن البيانات الأساسية، بينما الأشرطة شديدة النحافة تجعل من الصعب التمييز الدقيق بين التدرجات اللونية المتجاورة، خاصة في الخرائط اللونية المستمرة.
عند استخدام حزمة axes_grid1، يتم التحكم في السمك بدقة عبر المعلمة size في دالة append_axes. توفر المكتبة إمكانية تمرير سلاسل نصية تمثل نسباً مئوية دقيقة من عرض أو ارتفاع المحور الأصلي (مثل size="3%" أو size="5%")، وتعد النسبة بين 3% و 5% هي المعيار المثالي عالمياً لتحقيق التوازن بين الوضوح الإدراكي والرشاقة التصميمية في المجلات العلمية.
أما عند استخدام الدوال الأساسية، فيتم التحكم في الحجم عبر معلمة fraction (التي تمثل نسبة المحور الأصلي المستقطعة) مدمجة مع معلمة shrink (التي تتيح تقليص الطول الإجمالي لشريط الألوان بنسبة كسرية مثل shrink=0.8). ومع ذلك، تتفوق طريقة النسب المئوية في axes_grid1 بقدرتها على تثبيت النسبة بصرياً بصرف النظر عن التغيرات اللاحقة في أبعاد نافذة الرسم أو معاملات التحجيم التلقائي.
8.2 المعايرة الدقيقة للمسافات البينية (Pad Parameter Dynamics)
تمثل المعلمة pad المتغير الهندسي المسؤول عن ضبط الفجوة الفاصلة (White Space Gap) بين حدود المخطط البياني والحدود المقابلة لشريط الألوان. لا تنحصر أهمية هذه الفجوة في الناحية الجمالية فحسب، بل تمتد لتكون فاصلاً بنيوياً يمنع الالتباس الإدراكي بين حواف البيانات وحواف شريط القياس.
تخضع ديناميكية الحشو لقواعد رياضية ترتبط بنوع الموضع والتوجيه المستخدم:
- في التموضع الرأسي (يمين أو يسار)، يجب أن تراعي قيمة
padوجود أو غياب نصوص وعلامات تدريج المحور؛ حيث تكفي قيمةpad="2%"إلىpad="4%"في حال عدم وجود نصوص متداخلة، بينما ترتفع إلىpad="8%"أو أكثر في حال وجود تسميات وسيطة. - في التموضع الأفقي (أعلى أو أسفل)، تتطلب الفجوة مسافة أكبر نسبياً لاستيعاب ارتفاع الأرقام وعناوين المحاور، وتتراوح القيم المثالية عادة بين
pad=0.3وpad=0.6بوصة.
من الأهمية بمكان اختبار ثبات هذه المسافات عند حفظ الرسوم بصيغ الرسوميات المتجهية (SVG أو PDF) والرسوم النقطية (PNG)؛ حيث تضمن المعايرة باستخدام الوحدات المادية المستقلة (مثل النسب المئوية للمحور) بقاء المسافات البينية متناسبة تماماً مهما تغير حجم التكبير في وثيقة النشر النهائية.
8.3 التحكم في نسبة الطول إلى العرض (Aspect Ratio)
يشير مفهوم aspect في سياق شريط الألوان إلى النسبة الهندسية بين طول التدرج اللوني وسمكه العرضي. في دوال Matplotlib الأساسية، تقبل المعلمة aspect قيمة عددية تعبر عن النسبة بين الطول والعرض (القيمة الافتراضية هي 20، مما يعني أن طول الشريط يساوي عشرين ضعف سمكه).
تؤدي زيادة قيمة aspect (مثل aspect=35 أو aspect=40) إلى جعل شريط الألوان أكثر نحافة واستطالة، وهو مظهر مفضل في المخططات الحديثة المدمجة. بالمقابل، يؤدي تقليل القيمة (مثل aspect=10) إلى إنتاج شريط عريض ومكتنز، وهو ما يُستخدم عادة في الرسوم التعليمية أو عندما يحتوي شريط الألوان على نصوص توضيحية داخلية كثيفة أو علامات تدريج فئوية متباعدة.
عند دمج التحكم في نسبة الاستطالة مع مقسمات المحاور، يتم تحييد معلمة aspect التلقائية لصالح المعلمات الهندسية الصريحة المحددة في size وارتفاع المحور، مما يمنح المطور سيطرة رياضية مطلقة على أبعاد المستطيل الحاضن للتدرج اللوني، ويمنع تمدده غير المتناسق عند التعامل مع مخططات ذات أبعاد شاذة كالمخططات الشريطية فائقة العرض أو الرسوم الطولية الشاهقة.
9. التحكم في المحاور المخصصة (cax) مقابل معلمات المحاور التلقائية (ax)
9.1 التفريق الدقيق بين المعلمتين ax و cax في دالة colorbar
يعد التمييز الواعي بين المعلمتين ax و cax في دالة fig.colorbar() من أهم المفاتيح البرمجية للانتقال من مستوى الاستخدام الهواة إلى الاحتراف في Matplotlib. يمثل هذا التمييز خياراً معمارياً بين التوليد التلقائي المستقطع والتخصيص الهندسي الصريح.
تُستخدم المعلمة ax لتحديد المحور المرجعي (أو قائمة المحاور) الذي ستقتطع منه المكتبة مساحة لإنشاء شريط الألوان؛ أي أن تمرير ax=ax يعني إعطاء أمر للمكتبة بإعادة تحجيم المحور ax وتوليد محور جديد ضمنياً لشريط الألوان. بينما تُستخدم المعلمة cax (Colorbar Axes) لتحديد محور قائم ومخصص تم إنشاؤه مسبقاً ليوضع شريط الألوان بداخله مباشرة دون المساس بأي محور آخر.
القاعدة الهندسية الصارمة تنص على أنه في حال تحديد المعلمة cax، يتم تجاهل المعلمة ax وكافة معلمات التحجيم التلقائي مثل fraction وshrink وpad؛ نظراً لأن المحور الممرر عبر cax يمتلك بالفعل موقعه وأبعاده الهندسية الثابتة في فضاء الشكل، مما يوفر أداءً حسابياً أسرع واستقراراً تصميمياً مطلقاً لا يتأثر بتغيرات محركات التخطيط التلقائية.
9.2 إنشاء محاور مخصصة يدوياً باستخدام fig.add_axes
يوفر التابع fig.add_axes([left, bottom, width, height]) أقصى درجات الحرية في وضع شريط الألوان في أي نقطة جغرافية يختارها المطور داخل فضاء الشكل العام. تستقبل هذه الدالة قائمة رباعية من القيم الكسرية المعيارية المحصورة بين 0 و 1، والتي تحدد على التوالي:
left: الإحداثي الأفقي للزاوية السفلية اليسرى للمحور الجديد.bottom: الإحداثي الرأسي للزاوية السفلية اليسرى للمحور الجديد.width: العرض الكلي للمحور كنسبة من العرض الإجمالي للشكل.height: الارتفاع الكلي للمحور كنسبة من الارتفاع الإجمالي للشكل.
يتيح هذا الأسلوب بناء أشرطة ألوان عائمة (Floating Colorbars) أو تثبيت الشريط في زوايا محددة بدقة دون التقيد بمحاذاة المحاور البيانية الأصلية. على سبيل المثال، يمكن إنشاء شريط ألوان عمودي رفيع في أقصى يمين الشكل عبر الكود التالي:
cbar_ax = fig.add_axes([0.92, 0.15, 0.02, 0.7])
fig.colorbar(im, cax=cbar_ax)
على الرغم من القوة المطلقة لهذا الأسلوب، إلا أن عيبه الرئيسي يكمن في غياب الاستجابة التلقائية (Lack of Responsiveness)؛ فإذا تغيرت أبعاد الشكل العام أو تم تعديل هوامش الرسوم الأخرى، تظل الإحداثيات المطلقة ثابتة، مما قد يتطلب إعادة حساب ومعايرة يدوية للقيم الرباعية لضمان عدم حدوث تداخلات غير مرئية في شاشات العرض المختلفة.
9.3 استخدام كائنات InsetAxes للأشرطة المضمنة والعائمة
تمثل كائنات المحاور المضمنة (InsetAxes)، المتوفرة عبر حزمة mpl_toolkits.axes_grid1.inset_locator، الحل الهندسي الأمثل لوضع أشرطة الألوان العائمة والمضمنة داخل مساحة المخطط البياني نفسه (Internal Overlay Colorbars). يعد هذا النمط شائعاً جداً في الخرائط الجوية وصور الأقمار الصناعية لتوفير المساحة الخارجية بالكامل للبيانات.
تتيح دالة inset_axes تحديد موقع شريط الألوان داخل المحور الأصلي باستخدام معلمات مرجعية فائقة الدقة:
- الأبعاد (width, height): يمكن تحديدها كنسب مئوية من المحور الأصلي (مثل
width="40%", height="4%"للوضع الأفقي، أوwidth="3%", height="50%"للوضع الرأسي). - نقطة التثبيت (loc): تحدد زاوية التموضع داخل المخطط، مثل الزاوية العلوية اليمنى (
loc='upper right') أو السفلية اليسرى (loc='lower left'). - حدود الصندوق المرجعي (bbox_to_anchor و bbox_transform): تسمح بضبط إزاحات دقيقة داخل حدود المحور المضيف.
لحماية وضوح وقراءة شريط الألوان المضمن فوق خلفية البيانات المعقدة، توفر هذه التقنية إمكانية رسم لوحة خلفية شبه شفافة (Semi-transparent Patch) خلف شريط الألوان وعلاماته التدريجية، مما يضمن التباين البصري الكافي ويسهل قراءة القيم دون حجب المعالم الأساسية الكامنة تحتها في المخطط.
10. إدارة مواضع أشرطة الألوان في المخططات الفرعية المتعددة (Subplots & Grids)
10.1 شريط ألوان موحد لمصفوفة مخططات فرعية (Shared Colorbar)
في الدراسات المقارنة والتحليلات متعددة المتغيرات، يتم استخدام مصفوفات الرسوم الفرعية ($N \times M$) لعرض حالات تجريبية مختلفة لنفس الظاهرة الفيزيائية أو الإحصائية. في مثل هذه الهياكل، يمثل تكرار شريط ألوان لكل رسم فرعي هدراً بصرياً ومصدراً للارتباك؛ لذا تقتضي المعايير القياسية توحيد المجال الديناميكي للبيانات عبر معيار موحد (norm = Normalize(vmin, vmax)) وربط المصفوفة بأكملها بشريط ألوان مفرد ومشترك.
لتحقيق ذلك برمجياً، يتم تمرير قائمة كافة المحاور الفرعية إلى المعلمة ax في دالة شريط الألوان، أو تمرير مصفوفة المحاور المسطحة عبر ax=axes.ravel().tolist(). تقوم المكتبة في هذه الحالة باقتطاع مساحة موحدة ومنتظمة من جانب المصفوفة بأكملها، ووضع شريط ألوان وحيد يتمدد ليغطي الارتفاع أو العرض الكلي لشبكة الرسوم الفرعية:
fig.colorbar(im, ax=axes.ravel().tolist(), orientation='vertical', fraction=0.03, pad=0.04)
يضمن هذا الأسلوب توحيد المقياس اللوني لجميع اللوحات، مما يجعل المقارنة البصرية بين الحالات المختلفة فورية ودقيقة إحصائياً، كما يحافظ على انتظام محاذاة اللوحات الفرعية وتساوي مساحاتها العرضية والارتفاعية بدقة هندسية متكاملة.
10.2 تخصيص شريط ألوان مستقل لكل مخطط فرعي بدقة متناهية
في المقابل، عندما تمثل الرسوم الفرعية متغيرات فيزيائية مختلفة ذات وحدات قياس ومجالات عددية متباينة تماماً (مثل عرض درجة الحرارة بجانب الضغط الجوي وسرعة الرياح)، يصبح من الإلزامي تزويد كل لوحة فرعية بشريط ألوان خاص بها ومستقل تماماً في تدريجه ومداه اللوني.
إذا تم استخدام الطريقة الافتراضية في هذه الحالة، ستنكمش المحاور بشكل متفاوت بناءً على طول التسميات وعلامات التدريج لكل شريط، مما يدمر استقامة صفوف وأعمدة الشبكة. الحل المعماري الصارم هنا هو تطبيق حزمة axes_grid1 ومقسم المحاور make_axes_locatable بشكل تكراري على كل محور فرعي داخل حلقة المعالجة:
for ax in axes.flat:
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(im_sub, cax=cax)
يضمن هذا التكرار الممنهج بقاء كافة المخططات الفرعية بنفس الأبعاد والمحاذاة المربعة أو المستطيلة الدقيقة، مع إلحاق شريط ألوان متطابق هندسياً بكل مخطط على حدة، مما ينتج شبكة علمية بالغة التنسيق والأناقة.
10.3 استخدام شبكات التخطيط المتقدمة GridSpec و SubplotSpec
توفر وحدة matplotlib.gridspec.GridSpec المستوى الأعلى من التحكم الهيكلي في تصميم الصفحات وتوزيع اللوحات المعقدة. تتيح شبكات التخطيط تقسيم مساحة الشكل إلى شبكة افتراضية دقيقة من الصفوف والأعمدة، وتخصيص خلايا أو نطاقات خلايا محددة (Spanning) للمحاور البيانية وأشرطة الألوان.
من خلال GridSpec، يمكن حجز عمود كامل فائق النحافة في أقصى يمين الشبكة ليكون محورا مخصصاً لشريط ألوان مركزي يمتد عبر عدة صفوف، أو تخصيص صف سفلي نحيف يمتد عبر عدة أعمدة لشريط ألوان أفقي موحد. يتم ذلك عبر تحديد نطاقات الفهارس مثل cax = fig.add_subplot(gs[0:2, -1])، والذي يوجه المحور ليشغل العمود الأخير عبر الصفين الأول والثاني معاً.
يوفر هذا النموذج المعماري مرونة لا تضاهى في بناء لوحات المراقبة العلمية المعقدة (Scientific Dashboards) التي تجمع بين الرسوم ثنائية الأبعاد، والمساقط الطيفية، والخرائط الكنتورية في إطار واحد متماسك يخضع لنسب أبعاد صارمة وتوزيع مكاني محسوب بدقة بالغة.
11. التخصيص الجمالي والأسلوبي المتقدم لشريط الألوان وموضعه
11.1 تعديل امتدادات الأطراف والأسهم التوضيحية (Extensions)
في معالجة البيانات الإحصائية والفيزيائية، غالباً ما تحتوي البيانات على قيم متطرفة شاذة (Outliers) أو نطاقات تمتد خارج حدود التركيز الأساسية للرسم. توفر Matplotlib معلمة جمالية ووظيفية متقدمة تُعرف بـ extend لإدارة هذه الظاهرة البصرية على شريط الألوان.
تقبل المعلمة extend إحدى القيم التالية: 'neither' (الافتراضية، حواف مستطيلة مسطحة)، 'both' (إضافة أسهم مثلثة عند كلا الطرفين)، 'min' (سهم عند القاع أو اليسار)، أو 'max' (سهم عند القمة أو اليمين). يشير السهم المثلث بصرياً إلى أن الألوان الطرفية تمتد لتشمل كافة القيم التي تتجاوز القيمتين الصغرى والعظمى المحددة في $v_{\min}$ و $v_{\max}$.
تؤثر إضافة هذه الامتدادات المثلثية على الحجم الهندسي الكلي لشريط الألوان ومحاذاته؛ حيث تقوم المكتبة برسم المثلثات خارج المستطيل الأساسي للمحور. للتحكم في استطالة هذه الأسهم، يمكن ضبط المعلمة extendfrac لتحديد النسبة الطولية للرؤوس المثلثة، مع إمكانية تخصيص ألوان مستقلة للمثلثات عبر دوال خريطة الألوان المخصصة (cmap.set_over() و cmap.set_under()) لتمييز البيانات الخارجة عن النطاق بلون متباين (مثل الرمادي أو الوردي الفاقع)، مما يثري الدلالة التحليلية للمخطط.
11.2 تخصيص علامات القياس والنصوص المرافقة وفق المعايير الأكاديمية
يتطلب النشر في المجلات الأكاديمية المرموقة توافقاً صارماً في تنسيق النصوص وعلامات القياس (Ticks & Labels) بين شريط الألوان وبقية أجزاء المخطط البحثي. يشمل ذلك اختيار مواضع التدريجات وتطبيق المنسقات الرياضية المتوافقة مع نظام LaTeX المعياري.
للتحكم في مواقع علامات القياس، يتم تزويد شريط الألوان بمعلمات التحديد مثل ticks=np.linspace(min, max, num) أو تمرير كائنات التحديد المتخصصة من وحدة matplotlib.ticker، مثل MultipleLocator لتثبيت الفواصل العددية، أو LogLocator للبيانات اللوغاريتمية. كما يتم استخدام ScalarFormatter لتفعيل التدوين العلمي والأسي (Scientific Notation) عندما تمتد القيم إلى مراتب عددية شديدة الكبر أو الصغر.
يتم ضبط خصائص الخطوط عبر معلمات النمط العامة أو محلياً عبر توابع كائن شريط الألوان، مثل cbar.ax.tick_params(labelsize=10, direction='out', length=4, width=1)، مما يضمن خروج علامات التجزئة نحو الخارج بزوايا حادة ودقة طباعية عالية تتطابق تماماً مع عائلة الخطوط وأحجامها المعتمدة في متن البحث العلمي.
11.3 أشرطة الألوان المنفصلة والفئوية (Categorical/Discrete Colorbars)
عند تمثيل المتغيرات النوعية أو الفئوية (Categorical Data) – مثل تصنيفات استخدام الأراضي، أو الحالات المدارية للجسيمات، أو مستويات المخاطر الصحية – يفقد شريط الألوان المستمر دلالته العلمية، ويصبح من الضروري بناء شريط ألوان منفصل يتكون من كتل لونية متمايزة ومحددة بدقة.
يتم بناء هذه الأشرطة عبر دمج خريطة ألوان مجزأة (ListedColormap) مع كائن تطبيع الحدود (BoundaryNorm). في هذا السياق، تبرز مسألة التموضع الدقيق للنصوص؛ حيث يجب أن تتمركز التسميات الفئوية في منتصف الشريحة اللونية بدلاً من التموضع عند الحدود الفاصلة بين الشرائح.
تتيح دالة بناء شريط الألوان تحقيق ذلك عبر تمرير مصفوفة الحدود وتحديد مواضع التدريج في منتصف المسافات الفاصلة: ticks = (boundaries[:-1] + boundaries[1:]) / 2، تليها كتابة الأسماء التصنيفية الصريحة عبر cbar.ax.set_yticklabels(['الفئة أ', 'الفئة ب', 'الفئة ج']). يضمن هذا التنسيق الهندسي المتطابق محاذاة بصرية لا لبس فيها بين كل كتلة لونية والمسمى العلمي الدال عليها في كلا التوجيهين الرأسي والأفقي.
12. استكشاف الأخطاء الشائعة والحلول المثلى وأفضل الممارسات البرمجية
12.1 معالجة أخطاء تشوه الأبعاد وتقلص المخططات (Shrinking Plots)
تعد مشكلة تقلص وانكماش المخطط البياني الأساسي عند إضافة شريط الألوان الخطأ الأكثر شيوعاً وتكراراً في منتديات الدعم التقني وأوساط الباحثين. يرجع السبب الفيزيائي لهذه المشكلة إلى اعتماد واجهات الدوال المباشرة على اقتطاع مساحة من الصندوق المحيط للمحور الأصلي لإنشاء محور الشريط اللوني.
للتغلب على هذا التشوه وتثبيت الأبعاد الهندسية للمخطط، يتبع المنهج البرمجي الاحترافي إحدى استراتيجيتين رئيسيتين:
- الاستراتيجية الأولى: استخدام مقسمات المحاور (
axes_grid1)؛ كما تم تفصيله سابقاً، حيث تضمن هذه الطريقة إلحاق شريط الألوان دون المساس بمصفوفة التحويل الهندسي للمحور الأصلي، مع الحفاظ على نسبة الأبعاد (Aspect Ratio) ثابتة ومقفلة. - الاستراتيجية الثانية: إعادة حساب أبعاد الشكل الخارجي (Figure Resizing)؛ فبدلاً من إجبار المحاور على التزاحم داخل مساحة شكل ثابتة (مثال: $6 times 6$ بوصة)، يقوم المطور بزيادة عرض الشكل الخارجي مسبقاً (مثال: $7 times 6$ بوصة) وتخصيص البوصة الإضافية لمحور شريط الألوان عبر
fig.add_axes، مما يضمن بقاء مساحة الرسم الأساسي بأبعادها الكاملة دون فقدان أي جزء من مساحة العرض.
يقضي تطبيق هذه الاستراتيجيات على أي تشوه في الخلايا المربعة للخرائط الحرارية، ويضمن بقاء الدوائر تامة الاستدارة والخطوط البيانية محافظة على زوايا ميلها الرياضية الحقيقية.
12.2 حلول تعارض التخطيط التلقائي مع المحاور المخصصة
يواجه المطورون كثيراً ظهور تحذيرات برمجية من نوع UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect. يظهر هذا التحذير عندما يحاول محرك tight_layout تحسين مواضع محاور تم إنشاؤها عبر fig.add_axes أو مقسمات axes_grid1 التي تدير مساحاتها بأنظمة محولات مستقلة.
لحل هذه التعارضات الهيكلية وضمان استقرار التخطيط البرمجي، يُوصى باتباع الخطوات المنهجية التالية:
- تجنب استدعاء
plt.tight_layout()بعد استخدام مقسمات المحاورappend_axes؛ نظراً لأن المقسم يتولى بالفعل كافة مهام المحاذاة الدقيقة محلياً. - الاعتماد على محرك التخطيط الحديث عبر تمرير
layout="constrained"مباشرة عند إنشاء الشكل:fig, ax = plt.subplots(layout="constrained")، حيث يتميز هذا المحرك بقدرته الفائقة على التعرف على أشرطة الألوان المضافة ودمجها بسلاسة دون إطلاق تحذيرات برمجية. - ضبط الترتيب الزمني لتنفيذ الأوامر البرمجية؛ بحيث يتم أولاً رسم كافة البيانات، ثم إنشاء وتعديل شريط الألوان ومحاوره، وأخيراً استدعاء أوامر التصدير والحفظ، مما يضمن اكتمال بناء شجرة المشهد الرسومي (Scene Graph) قبل مرحلة التصيير النهائي.
12.3 دليل أفضل الممارسات البرمجية لكتابة كود نظيف وقابل للصيانة
يتطلب إنتاج رسوم بيانية علمية قوية وقابلة للصيانة والتطوير الالتزام بنمط البرمجة كائنية التوجه (Object-Oriented API) في Matplotlib، والابتعاد التام عن النمط الإجرائي القائم على استدعاءات plt.* العامة. يتيح النمط الكائني للمطور التعامل المباشر مع كائنات fig و ax و cbar، مما يمنع التداخلات البرمجية غير المقصودة عند التعامل مع أشكال متعددة في نفس البرنامج النصي.
تقتضي أفضل الممارسات تغليف عمليات بناء أشرطة الألوان وتعديل مواضعها داخل دوال مساعدة معيارية (Helper Functions) تستقبل المحور وكائن التعيين اللوني ومعلمات الموضع، وتعيد كائن شريط الألوان جاهزاً ومنسقاً. يسهم هذا التجريد البرمجي في توحيد المظهر البصري عبر آلاف الرسوم البيانية في المشاريع البحثية الكبرى ويسهل تعديل الأنماط التصميمية من مكان مركزي واحد.
أخيراً، يجب توخي أعلى درجات الدقة عند تصدير الرسوم البيانية للنشر النهائي؛ عبر استخدام fig.savefig('figure.pdf', dpi=300, bbox_inches='tight'). يضمن خيار bbox_inches='tight' قيام المكتبة بحساب الصندوق المحيط الفعلي لكافة العناصر بما فيها أشرطة الألوان المنزاحة وتسمياتها الخارجية، واقتصاص المساحات البيضاء الزائدة تلقائياً، مما ينتج ملفات متجهية فائقة الجودة وجاهزة مباشرة للإدراج في منظومات النشر العلمي المتقدمة.
خاتمة شاملة وتوصيات منهجية
يمثل شريط الألوان (Colorbar) في مكتبة Matplotlib عنصراً بيانياً محورياً يتجاوز مجرد كونه زينة شكلية إلى كونه أداة قياس علمية بالغة الدقة والحساسية الإدراكية. إن التحكم الاحترافي في موضعه، وأبعاده الهندسية، وفضاءاته المحيطية هو ما يميز الرسوم البيانية الاستكشافية البسيطة عن المخططات العلمية المؤهلة للنشر في كبريات الدوريات والمجلات العالمية المحكمة. يتطلب هذا التحكم إلماماً عميقاً بالمعمارية الكائنية للمكتبة، وفهماً دقيقاً لنظم الإحداثيات والتحويلات الهندسية، وتطبيقاً واعياً لأدوات تقسيم المحاور المتخصصة.
لقد استعرض هذا الدليل الموسع الميكانيكا الهندسية لتموضع شريط الألوان في كافة الاتجاهات الفراغية؛ مبيناً كيفية توظيف حزمة mpl_toolkits.axes_grid1 ومقسمات المحاور للتغلب على معضلة تقلص المخططات وتشوه نسب الأبعاد، وكيفية توظيف التموضع السفلي والعلوي لخدمة المقالات ذات القيود الأفقية، واستخدام التموضع الأيسر لتحقيق التوازن البصري وملاءمة النصوص العربية، وصولاً إلى بناء المحاور المضمنة والعائمة عبر InsetAxes والتحكم الشامل في اللوحات المعقدة عبر GridSpec.
ختاماً، نوصي الباحثين والمطورين بتبني النهج الكائني الصارم في كتابة كود الرسم البياني، واختيار خرائط الألوان المتوافقة إدراكياً، وتثبيت البذور العشوائية لضمان تكرارية النتائج، ومعايرة الحشو والمسافات البينية بما يضمن عدم تداخل النصوص وعلامات التدريج. إن الاستثمار في ضبط هذه التفاصيل الهندسية الدقيقة يضمن خروج الأعمال البحثية والتحليلية بأعلى درجات الوضوح والنزاهة العلمية والرقي الجمالي.
المراجع (References)
- Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90–95. https://doi.org/10.1109/MCSE.2007.55
- Caswell, T. A., Droettboom, M., Lee, A., de Andrade, E. S., Hoffmann, T. et al. (2023). matplotlib/matplotlib: Matplotlib version 3.8.0. Zenodo. https://doi.org/10.5281/zenodo.8344933
- Matplotlib Development Team. (2023). Customized Colorbars Tutorial and API Reference. Matplotlib Documentation. https://matplotlib.org/stable/api/colorbar_api.html
- Matplotlib Development Team. (2023). Overview of axes_grid1 Toolkit and AxesDivider Guide. Matplotlib Users Guide. https://matplotlib.org/stable/api/toolkits/axes_grid1.html
- Rougier, N. P. (2021). Scientific Visualization: Python + Matplotlib. Nicolas P. Rougier. https://github.com/rougier/scientific-visualization-book
- Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P. et al. (2020). Array programming with NumPy. Nature, 585(7825), 357–362. https://doi.org/10.1038/s41586-020-2649-2
- Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T. et al. (2020). SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python. Nature Methods, 17(3), 261–272. https://doi.org/10.1038/s41592-019-0686-2
- Moreland, K. (2009). Diverging Color Maps for Scientific Visualization. In Proceedings of the 5th International Symposium on Visual Computing (ISVC 2009), 92–103. https://doi.org/10.1007/978-3-642-10520-3_9
- Nuñez, J. R., Anderton, C. R., & Renslow, R. S. (2018). Optimizing colormaps with recognition of color vision deficiency to improve scientific communication. PLOS ONE, 13(7), e0199239. https://doi.org/10.1371/journal.pone.0199239
- Cleveland, W. S., & McGill, R. (1984). Graphical Perception: Theory, Experimentation, and Application to the Development of Graphical Methods. Journal of the American Statistical Association, 79(387), 531–554. https://doi.org/10.1080/01621459.1984.10478080