البرمجة الإحصائيةالتمثيل البصري للبياناتعلم البياناتلغة R

كيفية إنشاء مخطط شريطي مكدس في R (مع أمثلة)

دليل أكاديمي شامل ومفصل حول كيفية إنشاء وتخصيص المخططات الشريطية المكدسة (Stacked Barplots) في لغة البرمجة R باستخدام حزمة ggplot2 مع أمثلة عملية.

تاريخ النشر

تُعد عملية تمثيل البيانات بصرياً إحدى الركائز الأساسية في دورة التحليل الإحصائي والاستكشاف العلمي الحديث؛ إذ تمكّن الباحثين وصنّاع القرار من استخلاص الأنماط المعقدة وتفسير الظواهر متعددة الأبعاد بدقة وسرعة تفوق الجداول الإحصائية الصماء. ومن بين الأدوات البصرية المتقدمة، تبرز المخططات الشريطية المكدسة (Stacked Barplots) كأداة بيانية تجمع بين القدرة على إبراز المقادير الإجمالية للمتغيرات وتوضيح التوزيع النسبي لمكوناتها الفرعية في آن واحد. وتتيح بيئة الحوسبة الإحصائية R، لاسيما من خلال منظومة ggplot2 القائمة على قواعد قواعد النحو الرسومي (Grammar of Graphics)، إمكانات لا محدودة لبناء وتخصيص هذه المخططات بما يتماشى مع أعلى المعايير الأكاديمية والنشر العلمي الرصين.

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

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

1. مقدمة نظرية حول المخططات الشريطية المكدسة (Stacked Barplots) وأهميتها التحليلية

1.1 تعريف المخطط الشريطي المكدس وفلسفته البيانية

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

تستند الفلسفة البيانية لهذا المخطط إلى نظرية الإدراك البصري التي صاغها ويليام كليفلاند وروبرت ماكجيل (Cleveland & McGill)، والتي تفترض أن العين البشرية تقيّم الأطوال والمساحات بناءً على خطوط أساس مشتركة. وفي المخططات المكدسة، يتم توفير خط أساس موحد فقط للفئة الفرعية الأولى الواقعة في قاع الشريط ولإجمالي الشريط ككل، مما يجعل هذا المخطط أداة فائقة الكفاءة لإظهار العلاقة بين الأجزاء والكل (Part-to-Whole Relationship)، حيث يستطيع القارئ إدراك الحجم الكلي للمجموعة وفي الوقت نفسه تقدير الحصة النسبية التي تساهم بها كل فئة فرعية في تكوين هذا المجموع.

يختلف المخطط المكدس هيكلياً عن المخطط الشريطي البسيط الذي يتعامل مع متغير فئوي واحد، كما يختلف عن المخططات الشريطية المتجاورة أو المجمعة (Grouped/Clustered Barplots). فبينما تفرد المخططات المتجاورة شريطاً منفصلاً لكل فئة فرعية جنباً إلى جنب على نفس خط الأساس لتسهيل المقارنة المباشرة بين الفئات الفرعية المستقلة، يقوم المخطط المكدس بدمج هذه الفئات في مسار طولي واحد، مما يوفر مساحة أفقية كبيرة على لوحة الرسم ويسمح بمقارنة المجاميع الكلية دون التضحية بالرؤية التركيبية الداخلية.

1.2 متى نستخدم المخطط الشريطي المكدس مقارنة بالأنواع الأخرى

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

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

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

1.3 التطبيقات البحثية والنفسية والإحصائية للمخططات المكدسة

تحظى المخططات الشريطية المكدسة بانتشار واسع في مجالات القياس السيكومتري والعلوم السلوكية، ولاسيما في تحليل الاستجابات المتعددة المستويات على مقاييس ليكرت (Likert Scales). فعند قياس درجات القلق، أو الرضا الوظيفي، أو الاتجاهات النفسية عبر عينات بحثية متنوعة، تتيح هذه المخططات للباحث النفسي تصوير توزيع الاستجابات من “غير موافق بشدة” إلى “موافق بشدة” كنسب تراكمية ملونة تعكس طبيعة المناخ النفسي لكل فئة خاضعة للدراسة.

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

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

2. إعداد بيئة العمل في R وتجهيز الحزم الإحصائية الأساسية

2.1 تثبيت وتحميل حزمة ggplot2 والمكتبات التابعة

تعتمد صناعة الرسوم البيانية الحديثة والمتقدمة في لغة R بشكل رئيسي على بيئة tidyverse، وهي منظومة بيئية متكاملة تضم مجموعة من الحزم المصممة وفق فلسفة متسقة للتعامل مع البيانات الاستكشافية وتحليلها. في قلب هذه المنظومة تقع حزمة ggplot2 التي طورها عالم الإحصاء هادلي ويكهام (Hadley Wickham)، والتي تُحدث ثورة في كيفية تصور وبناء الرسوم البيانية عبر تجريد المخطط إلى طبقات برمجية مستقلة ومتراكبة تشمل البيانات، والجماليات، والهندسة، والمقاييس، والتنسيقات.

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

يتم تنفيذ أمر التثبيت عبر استدعاء الدالة install.packages("tidyverse") أو تحديد الحزم الفردية عبر install.packages(c("ggplot2", "dplyr", "scales", "tidyr")) داخل سطر الأوامر (R Console). وعقب اكتمال عملية التثبيت بنجاح، يتم تحميل هذه الحزم إلى جلسة العمل البرمجية الحالية باستخدام دالة library(ggplot2) ودالة library(dplyr) لضمان إتاحة الدوال الإحصائية والتحويلية المطلوبة لبناء المخططات.

2.2 هيكلة البيانات المطلوبة لبناء المخططات المكدسة

تشترط حزمة ggplot2 للعمل بكفاءة تامة أن تكون البيانات مدخلة في صيغة ما يُعرف باسم “البيانات المنظمة” أو النظيفة (Tidy Data). ويقوم هذا المفهوم المعياري على ثلاثة أسس هيكلية صارمة: يجب أن يمثل كل متغير عموداً مستقلاً (Column)، ويجب أن يمثل كل رصد أو مشاهدة صفاً منفرداً (Row)، ويجب أن تمثل كل قيمة داخل الجدول خلية بيانية واحدة محددة الأبعاد والمعنى الإحصائي.

لبناء مخطط شريطي مكدس متكامل، يحتاج الإطار البياني (Data Frame) إلى ثلاثة عناصر محورية على الأقل يتم ربطها لاحقاً بجماليات الرسم:

  • المتغير الفئوي الأساسي (X-axis): وهو المتغير المستقل الذي يحدد الأشرطة الرئيسية المتتابعة على المحور الأفقي، مثل أسماء الفرق، أو المجموعات التجريبية، أو السنوات الزمنية.
  • المتغير الفئوي للتقسيم الداخلي (Fill aesthetic): وهو المتغير التصنيفي الثانوي الذي يحدد كيفية تجزئة الشريط الواحد إلى قطاعات فرعية ملونة تمثل البنية الداخلية لكل مجموعة.
  • المتغير الكمي أو التكراري (Y-axis): وهو المتغير الرقمي التابع الذي يحدد طول وارتفاع كل قطاع وشريط إجمالي بناءً على القيم الإحصائية المسجلة أو المحسوبة.

من الأهمية بمكان التأكد من أن المتغيرات الفئوية مصنفة صراحة كعوامل إحصائية (Factors) داخل بيئة R، وليس كمجرد سلاسل نصية عادية (Character Strings). يتيح تحويل الأعمدة إلى عوامل ضبط المستويات التصنيفية بدقة، وتحديد الترتيب المنطقي للظهور على محاور الرسم وفي وسيلة الإيضاح، وتفادي السلوك الافتراضي الذي يعتمد على الترتيب الأبجدي الآلي الذي قد لا يتناسب دائماً مع المتغيرات الترتيبية كالرتب الأكاديمية أو مستويات مقاييس ليكرت.

2.3 معالجة القيم المفقودة وإعداد الإطار البياني النموذجي

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

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

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

3. إنشاء المخطط الشريطي المكدس الأساسي باستخدام دالة ggplot()

3.1 بناء إطار البيانات النموذجي وتحليله إحصائياً

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

يتم إنشاء هذا الإطار البرمجي بتعريف عمود الفريق الرياضي team الذي يحتوي على تكرارات للفرق (A, B, C, D)، وعمود موقع اللاعب position الذي يضم تصنيفات المراكز (Guard, Forward, Center)، وعمود النقاط points الذي يحمل القيم العددية التي ستحدد الارتفاعات النسبية للأشرطة. يمثل هذا التوزيع مصفوفة بيانات مستعرضة (Cross-sectional Data) نموذجية توضح العلاقة المتشابكة بين الانتماء المؤسسي (الفريق) والدور الوظيفي (موقع اللعب) ومستوى الإنتاجية المحقق (النقاط).

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

Stacked barplot in R
Stacked barplot in R

3.2 استخدام الدالة ggplot() وتعيين الجماليات (Aesthetic Mappings)

يمثل استدعاء دالة ggplot() نقطة الانطلاق الأساسية لتهيئة الكائن الرسومي داخل نظام tidyverse. تقوم هذه الدالة بإنشاء لوحة الرسم الأولية وتحديد مصدر البيانات الذي ستستند إليه جميع الطبقات الهندسية اللاحقة. يمرر إطار البيانات كمعامل أول داخل الدالة عبر الوسيط data = df، مما يربط البيئة الرسومية بمصفوفة المتغيرات الرياضية المعرفة سابقاً.

تتم عملية تعيين الخصائص الجمالية والروابط البصرية من خلال الدالة المساعدة aes()، وهي المسؤولة عن مطابقة الأعمدة البيانية في جدول البيانات مع المحاور والسمات المرئية للمخطط. في المخطط الشريطي المكدس الأساسي، يتم تعيين المتغير الفئوي team للمحور الأفقي عبر x = team، وتعيين المتغير الكمي points للمحور الرأسي عبر y = points، مما يضمن أن تمثل الأشرطة الفرق المختلفة وأن تعبر الارتفاعات عن حجوم النقاط المسجلة.

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

3.3 تطبيق الطبقة الهندسية geom_bar() وضبط التكديس

لا تقوم دالة ggplot() بمفردها برسم أي أشكال بيانية على اللوحة، بل تتطلب إضافة “طبقة هندسية” (Geometric Layer) تحدد النمط البصري المراد استخدامه لتمثيل البيانات. يتم ربط الطبقات الهندسية بالكائن الرسومي الأساسي باستخدام معامل الجمع الرياضي +، وهو المعامل المميز لمنظومة ggplot2 الذي يتيح تراكم التعليمات التنسيقية والتحليلية طبقة تلو الأخرى بأسلوب نمطي سلس ومرن للغاية.

لرسم الأشرطة المكدسة بالاعتماد على قيم النقاط المحددة مسبقاً في جدول البيانات، نستخدم الطبقة الهندسية geom_bar() مع ضرورة ضبط الوسيط الإحصائي stat = "identity". يُعد هذا الضبط محورياً؛ لأن القيمة الافتراضية لدالة geom_bar() هي stat = "count" والتي تقوم بحساب تكرار الصفوف آلياً وتفترض عدم وجود متغير مخصص للمحور الرأسي Y. وبتحويلها إلى “identity”، نوجه R لقراءة القيم الرقمية الفعلية الموجودة في عمود النقاط واستخدامها مباشرة لتحديد ارتفاع القطاعات.

يتم تفعيل التكديس التراكمي افتراضياً داخل geom_bar() عبر وسيط الموضع position = "stack". يقوم هذا الخيار بصف القطاعات الملونة رأسياً فوق بعضها البعض لكل شريط أفقي، حيث يبدأ القطاع الأول من خط الأساس صفر، ثم يبدأ القطاع الثاني مباشرة من النقطة العليا التي انتهى عندها القطاع الأول، وهكذا دواليك. ينتج عن هذا التراكم شريط يعبر ارتفاعه الكلي عن المجموع الحسابي الدقيق لكافة النقاط التي حققها الفريق بمختلف مراكز لاعبيه.

4. التحويل بين المخطط المكدس بالقيمة والمخطط المكدس بالنسب المئوية (100% Stacked)

4.1 المخطط المكدس التراكمي (Standard Stacked Barplot)

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

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

يتم بناء هذا المخطط برمجياً عبر الحفاظ على الضبط الافتراضي position = "stack" داخل دالة geom_bar() أو استخدام دالة geom_col(position = "stack") المتخصصة. ويقوم محرك التحليل الرسومي داخلياً بحساب المجموع التراكمي لكل فئة على المحور السيني، وضبط تدريج المحور الصادي تلقائياً ليمتد من الصفر وحتى أعلى قمة إجمالية مسجلة بين جميع الأشرطة، مما يضمن عرض كافة التفاصيل الرياضية دون اقتطاع.

Stacked barplot in R using ggplot2
Stacked barplot in R using ggplot2

4.2 إنشاء المخطط المكدس بالنسب المئوية باستخدام position = ‘fill’

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

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

لتعزيز القيمة التفسيرية والجمالية للمخطط النسبي، يُستحسن تحويل التدريج العشري الافتراضي للمحور الرأسي (الذي يظهر بصيغة 0.00، 0.25، 0.50، 0.75، 1.00) إلى نسب مئوية واضحة ومقروءة مباشرة. ويتم ذلك بربط حزمة scales واستخدام دالة تخصيص المحور scale_y_continuous(labels = scales::percent)، مما يضفي طابعاً احترافياً على الرسم ويسهل استيعابه الفوري من قبل القراء ومحكمي الأبحاث.

4.3 مقارنة منهجية وبصرية بين position = ‘stack’ و position = ‘fill’

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

  • نمط التكديس التراكمي (position = “stack”):
    • المحور الرأسي (Y): يمثل القيم المطلقة والتكرارات الإجمالية المقاسة بوحدات القياس الأصلية للبيانات.
    • ارتفاع الأشرطة: متباين ومتفاوت وفقاً لاختلاف المجاميع الكلية لكل فئة رئيسية.
    • التركيز التحليلي: إبراز الفروق في الحجم الكلي مع إعطاء لمحة عن التكوين الداخلي.
    • مجال التطبيق الأمثل: مقارنة الإنتاجية الإجمالية، والمبيعات، وتوزيع الميزانيات، وحجوم العينات المختلفة.
  • نمط التكديس النسبي (position = “fill”):
    • المحور الرأسي (Y): يمثل الأوزان النسبية والكسور المئوية الموحدة التي تتراوح بين 0% و 100%.
    • ارتفاع الأشرطة: ثابت وموحد لكافة الأشرطة عبر جميع الفئات على امتداد الرسم البياني.
    • التركيز التحليلي: مقارنة التوزيع البنيوي والمقادير النسبية بمعزل تام عن الحجم الإجمالي.
    • مجال التطبيق الأمثل: استجابات مقاييس ليكرت، والتركيبات الديموغرافية، وتوزيع النسب الوبائية والسلوكية.

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

5. تخصيص الألوان ولوحات التدرج البصري (Color Palettes)

5.1 التحكم اليدوي في الألوان باستخدام scale_fill_manual()

تُعد الألوان في المخططات الشريطية المكدسة عنصراً بيانياً ودلالياً فائق الأهمية؛ حيث إنها الوسيلة البصرية الوحيدة التي تمكّن القارئ من الفصل بين القطاعات المتراكبة وتتبع مسار الفئات الفرعية عبر الأشرطة المتجاورة. توفر حزمة ggplot2 تحكماً دقيقاً ومطلقاً في تخصيص هذه الألوان عبر دالة scale_fill_manual() التي تتيح للباحث تمرير مصفوفة لونية محددة تتوافق مع المعايير التصميمية لمشروعه أو الهوية البصرية للمؤسسة البحثية.

يتطلب استخدام دالة scale_fill_manual(values = c(...)) تحديد قيم الألوان بدقة، سواء باستخدام الأسماء اللونية المعيارية المدعومة في بيئة R (مثل “coral”, “steelblue”, “goldenrod”) أو عبر الأكواد السداسية العشرية (HEX Codes) مثل #E41A1C و #377EB8. تضمن الأكواد السداسية أعلى درجات الدقة والاتساق اللوني عند إعادة إنتاج الرسوم عبر منصات متعددة وتجنب أي تباين غير مقصود في درجات الظلال.

من الضروري عند ضبط الألوان يدوياً التأكد من أن عدد الألوان الممررة في المتجه values يتطابق تماماً مع عدد المستويات الفئوية الموجودة في متغير التعبئة. كما يُفضل تعيين أسماء المستويات صراحة داخل المتجه كأزواج مفتاحية (Named Vector)، مثل values = c("Center" = "#1B9E77", "Forward" = "#D95F02", "Guard" = "#7570B3")؛ لضمان ثبات ارتباط اللون بالفئة المحددة حتى لو تغير ترتيب البيانات أو أُعيدت هيكلتها لاحقاً.

5.2 استخدام لوحات الألوان الجاهزة عبر RColorBrewer و Viridis

بدلاً من تحديد الألوان يدوياً ومواجهة مخاطر التنافر البصري أو ضعف التباين، يفضل علماء البيانات الاعتماد على لوحات ألوان إحصائية مصممة ومختبرة علمياً لتحسين الإدراك البصري. وتوفر حزمة RColorBrewer المدمجة في ggplot2 عبر دالة scale_fill_brewer() مجموعة واسعة من اللوحات المصنفة إلى ثلاث عائلات رئيسية تلبي الاحتياجات البحثية المتنوعة:

  • اللوحات النوعية (Qualitative Palettes): مثل “Set1” و “Set2” و “Dark2″، وهي مصممة خصيصاً للمتغيرات الفئوية الاسمية غير المرتبة (مثل مراكز اللاعبين أو أسماء المدن)، حيث تضمن تبايناً بصرياً متكافئاً بين الفئات دون إعطاء انطباع بأفضلية أو تدرج كمي لفئة على أخرى.
  • اللوحات المتسلسلة (Sequential Palettes): مثل “Blues” و “Reds” و “Purples”، وتستخدم للمتغيرات الترتيبية التي تتدرج من مستويات منخفضة إلى مرتفعة (مثل مقاييس الشدة والجرعات الدوائية).
  • اللوحات المتباعدة (Diverging Palettes): مثل “RdBu” و “Spectral”، وتعتمد على إبراز قطبين متنافرين يتوسطهما حياد، مما يجعلها مثالية لتمثيل استجابات مقاييس ليكرت من الرفض التام إلى القبول التام.

كما تُعد حزمة viridis عبر دالة scale_fill_viridis_d() المعيار الذهبي الحديث في النشر العلمي؛ حيث تتميز لوحاتها (مثل “viridis”, “magma”, “plasma”) بأنها متناسقة إدراكياً وسلسة عبر كافة شاشات العرض الرقمية، فضلاً عن كونها قابلة للقراءة والتمييز التام حتى عند طباعة البحث باللونين الأبيض والأسود أو بتدرجات الرمادي.

5.3 مراعاة إمكانية الوصول البصري وتصميم رسوم ملائمة لعمى الألوان

تفرض أخلاقيات البحث العلمي ومعايير النشر في المجلات المرموقة مراعاة “إمكانية الوصول الشامل” (Accessibility) عند تصميم الرسوم البيانية، لضمان قدرة كافة أفراد المجتمع العلمي، بما في ذلك الأفراد الذين يعانون من اضطرابات رؤية الألوان (Color Blindness)، على قراءة النتائج وتفسيرها دون عوائق. وتُظهر الإحصائيات الطبية أن ما يقرب من 8% من الذكور يعانون من صعوبة التمييز بين درجات معينة من الطيف المرئي.

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

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

6. إضافة النصوص وتخصيص العناوين والمحاور والملصقات الرقمية

6.1 تخصيص العناوين وبيانات التوثيق باستخدام دالة labs()

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

تشمل العناصر النصية التي يجب تضمينها بدقة عبر دالة labs() ما يلي:

  • العنوان الرئيسي (title): عبارة مكثفة وواضحة تلخص الفكرة الجوهرية للرسم البياني وتبرز المقارنة الأساسية.
  • العنوان الفرعي (subtitle): نص تفسيري مكمل يقدم تفاصيل إضافية حول المنهجية المتبعة، أو الفترة الزمنية، أو طبيعة العينة المدروسة.
  • تسميات المحاور (x و y): تحديد أسماء المتغيرات المستقلة والتابعة مقرونة بوحدات القياس الدقيقة (مثل: النقاط الإجمالية، النسبة المئوية %، الأيام).
  • عنوان وسيلة الإيضاح (fill): تعديل التسمية التلقائية لوسيلة الإيضاح لتصبح وصفاً لغوياً صحيحاً بدلاً من الاسم البرمجي للعمود.
  • التعليق التوضيحي والتذييل (caption): توثيق مصدر البيانات الأصلي، وحجم العينة (N)، وأي ملاحظات منهجية تقتضيها معايير التوثيق الأكاديمي.

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

6.2 إدراج التسميات الرقمية داخل القطاعات المكدسة باستخدام geom_text()

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

يتطلب إدراج النصوص داخل الأشرطة المكدسة ضبطاً دقيقاً لوسيط الموضع لضمان تمركز الأرقام في منتصف مساحة كل قطاع ومنع تداخلها العشوائي. يتم تحقيق ذلك برمجياً من خلال تمرير دالة الموضع المكدس المخصصة position = position_stack(vjust = 0.5) داخل geom_text()، حيث يقوم الوسيط vjust = 0.5 بحساب نقطة المنتصف الهندسي الرأسي للقطاع وتثبيت النص داخلها بدقة رياضية متناهية.

للتحكم في المظهر الجمالي للأرقام المدرجة، تتيح geom_text() ضبط وسائط متعددة تشمل لون الخط color = "white" لضمان مقروئيته فوق الخلفيات الداكنة، وحجم النص size = 4 بما يتناسب مع أبعاد المخطط، وسماكة الخط fontface = "bold" لتعزيز الوضوح البصري. وفي المخططات النسبية المئوية، يُستبدل position_stack() بـ position_fill(vjust = 0.5) مع صياغة ملصق النسبة باستخدام دوال التنسيق مثل aes(label = scales::percent(..count../sum(..count..))) أو بحسابها المسبق عبر dplyr.

6.3 تنسيق أرقام المحاور والنسب المئوية عبر حزمة scales

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

عند بناء المخططات الشريطية المكدسة، يُستخدم أمر scale_y_continuous() للتحكم في سلوك المحور الرأسي عبر وسائط متعددة؛ حيث يحدد وسيط breaks نقاط التقسيم والعلامات الإرشادية على المحور (مثل breaks = seq(0, 100, by = 20))، بينما يحدد وسيط limits الحدود الدنيا والعليا للمحور لضمان توفير مساحة كافية لاحتواء الأشرطة والنصوص دون قص أطرافها العليا.

وفي حالات احتواء المحور الأفقي على أسماء فئات طويلة قد يؤدي ظهورها الأفقي إلى تداخل النصوص وتشوه المظهر العام، تتيح حزمة scales ودوال التنسيق في ggplot2 تدوير نصوص المحور بزاوية مائلة أو عمودية (مثل 45 أو 90 درجة) مع محاذاتها أفقياً، مما يحافظ على التنسيق الجمالي ويوفر تجربة قراءة مريحة للمتلقي.

7. ضبط السمات العامة والمظهر التنسيقي (Themes & Aesthetics)

7.1 تطبيق السمات المدمجة الجاهزة (Built-in Themes)

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

توفر ggplot2 مجموعة من السمات المدمجة الجاهزة (Themes) التي تغير البنية التنسيقية للمخطط بلمسة واحدة، ومن أبرزها وأكثرها استخداماً في السياقات الأكاديمية:

  • theme_bw(): سمة كلاسيكية ذات خلفية بيضاء نقية محاطة بإطار خارجي أسود رفيع وخطوط شبكة رمادية فاتحة، وتُعد خياراً ممتازاً لمعظم الأوراق البحثية.
  • theme_minimal(): سمة عصرية تتبنى فلسفة التبسيط التام، حيث تستغني عن الإطارات الخارجية وتقلل من الخطوط الإرشادية لتعظيم “نسبة الحبر إلى البيانات” (Data-Ink Ratio).
  • theme_classic(): سمة أكاديمية صارمة تحاكي الرسوم الإحصائية التقليدية بخطي محور X و Y فقط دون أي خطوط شبكة داخلية أو خلفيات متباينة، وهي المفضلة لدى مجلات علم النفس والعلوم الحيوية.

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

R stacked barplot with custom theme
R stacked barplot with custom theme

7.2 التخصيص المتقدم للعناصر باستخدام دالة theme()

عند الرغبة في الوصول إلى أدق تفاصيل التصميم الجرافيكي، تمنح دالة theme() المتقدمة مرونة لا متناهية لتعديل وتخصيص كل عنصر بصري على حدة داخل لوحة الرسم. وتعتمد هذه الدالة على نظام هرمي يستخدم دوال مساعدة خاصة بنوع العنصر المراد ضبطه، مثل element_text() للنصوص، و element_line() للخطوط، و element_rect() للمساحات والأطر المستطيلة، و element_blank() لإلغاء وحذف العناصر نهائياً.

يتيح التخصيص عبر theme() التحكم في حجم ونوع وموقع العناوين؛ فمثلاً يمكن تعديل العنوان الرئيسي وجعله في منتصف الرسم بالخط العريض عبر كتابة plot.title = element_text(hjust = 0.5, size = 16, face = "bold", margin = margin(b = 10)). يضمن وسيط hjust = 0.5 المحاذاة المركزية الدقيقة، بينما يوفر margin مسافة أمان رأسية تفصل العنوان عن قمم الأشرطة الشريطية لمنع أي ازدحام بصري.

كما تمتد خيارات التخصيص لتشمل إزالة خطوط الشبكة الثانوية غير الضرورية عبر panel.grid.minor = element_blank()، والتحكم في سماكة ولون خطوط المحاور الرئيسية عبر axis.line = element_line(color = "black", linewidth = 0.8)، وضبط الهوامش الإجمالية المحيطة بلوحة الرسم البياني بالكامل عبر plot.margin = margin(15, 15, 15, 15)، مما ينتج تخطيطاً هندسياً عالي التوازن يلبي معايير أرقى مطابع النشر العلمي.

7.3 التحكم في موضع وتنسيق وسيلة الإيضاح (Legend Customization)

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

يمكن تعديل موضع وسيلة الإيضاح بمرونة وسلاسة فائقة عبر دالة theme(legend.position = ...)؛ حيث يمكن نقلها إلى الأسفل باستخدام "bottom" أو إلى الأعلى عبر "top" مما يتيح للأشرطة التمدد بكامل العرض الأفقي للوحة. كما يمكن تثبيتها داخل الفراغ الداخلي للرسم بتمرير إحداثيات ثنائية الأبعاد مثل legend.position = c(0.85, 0.8) عندما تسمح المساحات الفارغة بذلك دون أن تحجب أياً من الأشرطة البيانية.

ولتحسين المظهر التنسيقي لصندوق الإيضاح، يمكن توجيه ترتيب العناصر لتصبح أفقية متتالية باستخدام legend.direction = "horizontal"، وتعديل حجم المربعات اللونية الدلالية عبر legend.key.size = unit(0.5, "cm")، وإزالة الإطار المحيط أو تلوين خلفيته بما ينسجم تماماً مع الخلفية العامة للمخطط.

8. إدارة وترتيب المتغيرات الفئوية (Factor Ordering)

8.1 مفهوم العوامل (Factors) وتأثيرها على ترتيب الأشرطة

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

يُمثل مفهوم “العوامل” (Factors) الحل الهيكلي الأصيل لهذه المعضلة في لغة R؛ فالعامل ليس مجرد نص، بل هو متغير فئوي يرتبط بمصفوفة خفية من “المستويات” (Levels) المرتبة ترتيباً دقيقاً. يتحكم هذا الترتيب الداخلي للمستويات بشكل مباشر ومطلق في الترتيب المكاني الذي ستتخذه الفئات على محاور ومساحات مخططات ggplot2؛ حيث تُرسم المستويات الأولى دائماً في أقرب نقطة لنقطة الأصل.

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

8.2 الترتيب التلقائي بناءً على القيم الإحصائية باستخدام حزمة forcats

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

تُعد دالة fct_reorder() إحدى أقوى أدوات هذه الحزمة، حيث تتيح إعادة ترتيب أشرطة المحور الأفقي تصاعدياً أو تنازلياً وفقاً للمجموع الإجمالي للنقاط أو متوسط القيم المحققة لكل فريق، وذلك بصياغة برمجية مباشرة: x = fct_reorder(team, points, .fun = sum, .desc = TRUE). يضمن هذا الترتيب الديناميكي ظهور الأشرطة بتسلسل هرمي منسق يوجه انتباه المتلقي فوراً من الأداء الأعلى إلى الأدنى.

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

8.3 التطابق بين ترتيب وسيلة الإيضاح وترتيب القطاعات المكدسة

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

لحل هذه المشكلة ومزامنة التدفق البصري لقراءة المخطط، توفر ggplot2 دالة التحكم في الإرشادات guides() التي تتيح عكس ترتيب وسيلة الإيضاح ليتطابق بنيوياً مع الترتيب الرأسي للقطاعات من القمة إلى القاع. يتم تنفيذ ذلك عبر الأمر البرمجي: guides(fill = guide_legend(reverse = TRUE))، وهو تعديل تنسيقي بسيط يرفع من جودة الرسم البياني ويعزز سهولة القراءة الفورية للمخططات المعقدة.

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

9. معالجة وتحويل البيانات: من التنسيق العريض (Wide) إلى التنسيق الطويل (Long)

9.1 الفرق بين التنسيق العريض (Wide) والتنسيق الطويل (Long)

غالباً ما يتم تسجيل البيانات الأولية وتجميعها في المؤسسات البحثية والبرامج الإحصائية التقليدية في جداول ذات “تنسيق عريض” (Wide Format). في هذا التنسيق، تُمثل كل مجموعة أو فئة فرعية عموداً منفصلاً يحمل قيمه الخاصة (مثل وجود عمود خاص بنقاط لاعبي الحراسة Guard، وعمود آخر لنقاط لاعبي الهجوم Forward، وعمود ثالث للاعبي الارتكاز Center)، وتتوزع الفرق على الصفوف.

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

لذلك، يتطلب مسار العمل التحليلي السليم تحويل البيانات حتماً إلى “التنسيق الطويل” (Long Format). في هذا التنسيق المنظم، تندمج كافة الأعمدة المتفرقة في عمودين رئيسيين جديدين: عمود يجمع مسميات الفئات السابقة (Key/Name)، وعمود آخر يجمع كافة الأرقام والقيم المقابلة لها (Value)، مما يسمح بتعيين هذه الأعمدة مباشرة لوسائط x و y و fill داخل aes().

9.2 استخدام دالة pivot_longer() من حزمة tidyr للتحويل

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

لبناء صيغة التحويل البرمجية النموذجية، نحدد أولاً أسماء الأعمدة العريضة المراد طيها ودمجها عبر وسيط cols = c("Guard", "Forward", "Center") (أو باستثناء الأعمدة الثابتة عبر cols = -team). ثم نحدد اسم العمود الفئوي الجديد الذي سيحتوي على أسماء هذه المراكز عبر وسيط names_to = "position"، ونحدد اسم العمود الرقمي الجديد الذي ستستقر فيه النقاط عبر values_to = "points".

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

9.3 تجميع وتلخيص البيانات الخام باستخدام حزمة dplyr

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

توفر حزمة dplyr بيئة متكاملة لبناء خطوط أنابيب لمعالجة البيانات (Data Pipelines) باستخدام معامل الربط الشهير %>% أو المعامل الأصلي في R الحديثة |>. يتم استخدام دالة group_by(team, position) لتقسيم البيانات داخلياً وفق التقاطعات الفئوية، ثم تُتبع بدالة summarise(total_points = sum(points), .groups = "drop") لحساب المجاميع الفعلية بدقة رياضية متناهية.

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

10. حالات دراسية وأمثلة تطبيقية متقدمة في سياقات بحثية متعددة

10.1 المثال التطبيقي الأول: تحليل بيانات الأداء الرياضي (بيانات Bobbitt)

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

يبدأ البناء بتجميع الشيفرة التي تربط إطار البيانات المجهز بدالة ggplot(df, aes(x = team, y = points, fill = position))، متبوعة بإضافة الطبقة الهندسية geom_bar(stat = "identity", width = 0.7, color = "black", linewidth = 0.3) لإضافة حدود خارجية سوداء رقيقة للأشرطة تبرز التباين اللوني. ثم نضيف التسميات الرقمية المركزية عبر geom_text(aes(label = points), position = position_stack(vjust = 0.5), color = "white", fontface = "bold", size = 4).

تكتمل اللوحة بتطبيق لوحة الألوان المخصصة scale_fill_brewer(palette = "Dark2")، وإضافة النصوص الوصفية الكاملة عبر labs() لتوثيق عنوان التحليل والمحاور والمصدر، واختيار السمة الأكاديمية theme_minimal() مع تعديل موضع وسيلة الإيضاح لتصبح في الأسفل أفقياً ومطابقة ترتيبها مع ترتيب القطاعات عبر guides(fill = guide_legend(reverse = TRUE)). ينتج عن ذلك مخطط متكامل يجمع بين الدقة الرياضية والجمال البصري والوضوح التحليلي.

10.2 المثال التطبيقي الثاني: توزيع الاستجابات النفسية والسمات السلوكية

لتوضيح التطبيقات السيكومترية المتقدمة، نبني في هذا المثال إطار بيانات يحاكي دراسة نفسية تقيس مستويات القلق والتوتر لدى عينة من المشاركين عبر ثلاث مجموعات تجريبية (مجموعة العلاج السلوكي المعرفي CBT، مجموعة الدواء الوهمي Placebo، والمجموعة الضابطة Control). وتُقاس الاستجابات على مقياس ترتيبي ثلاثي: (منخفض Low، متوسط Moderate، مرتفع High).

تتم معالجة هذه البيانات لبناء مخطط شريطي مكدس بنسبة 100% باستخدام position = "fill"؛ نظراً لأن الهدف هو مقارنة التوزيع النسبي لمستويات القلق بين المجموعات التجريبية الثلاث بغض النظر عن الفروق الطفيفة في أعداد المشاركين بكل مجموعة. يتم تعيين مستويات القلق كعامل ترتيبي لضمان ظهور “منخفض” في القاع، يليه “متوسط”، ثم “مرتفع” في القمة.

في هذا السياق النفسي، يتم تطبيق لوحة ألوان دلالية متباعدة أو متدرجة تعكس شدة القلق، مثل التدرج من الأخضر المهدئ للمستوى المنخفض، إلى الأصفر للمستوى المتوسط، وصولاً إلى الأحمر القاني للمستوى المرتفع. ويتم تنسيق المحور الرأسي ليعرض النسب المئوية الدقيقة scale_y_continuous(labels = scales::percent) مع طباعة نسب الاستجابة داخل كل قطاع، مما يوفر للباحث النفسي لوحة بصرية متكاملة تؤكد أو تدحض الفرضيات العلاجية بوضوح تام.

10.3 المثال التطبيقي الثالث: المخططات المكدسة متعددة الأوجه (Faceting)

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

يقدم نظام ggplot2 حلاً برمجياً عبقرياً لهذه الإشكالية من خلال تقنية تقسيم الأوجه أو المخططات الصغيرة المتعددة (Small Multiples / Faceting) عبر دالتي facet_wrap() و facet_grid(). تتيح هذه الدوال تكرار المخطط الشريطي المكدس بالكامل وتقسيمه إلى شبكة من اللوحات الفرعية المتجاورة والمستقلة، بحيث تعبر كل لوحة فرعية عن مستوى محدد من مستويات المتغير الثالث.

تُضاف هذه الطبقة ببساطة إلى الكائن الرسومي عبر كتابة + facet_wrap(~ gender, ncol = 2)، مما ينشئ لوحتين متجاورتين للأداء المكدس: واحدة للذكور وأخرى للإناث، مع توحيد مقاييس المحاور لتسهيل المقارنة البصرية الفورية. وتتيح الدالة خيارات إضافية للتحكم في استقلالية المحاور عبر scales = "free_y"، وتنسيق أشرطة العناوين الفرعية للأوجه (Facet Strips) لتتناسق تماماً مع الهيكل الجمالي العام للمخطط.

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

11.1 الخلط بين stat = ‘identity’ و stat = ‘count’

يُعد الخطأ البرمجي الأكثر شيوعاً وتكراراً بين مستخدمي ggplot2 المبتدئين والمتوسطين عند إنشاء المخططات الشريطية هو ظهور رسالة الخطأ الشهيرة: Error: stat_count() must not be used with a y aesthetic. تنشأ هذه المشكلة نتيجة سوء فهم الآلية الرياضية التي تحسب بها دالة geom_bar() أبعاد الأشكال البيانية.

في حالتها الافتراضية، تستخدم geom_bar() التحويل الإحصائي stat = "count"، وهي آلية مبرمجة لحساب عدد تكرارات الصفوف آلياً من البيانات الخام، وتتوقع استقبال متغير واحد فقط على المحور الأفقي X وترفض رفضاً قاطعاً وجود متغير معرف مسبقاً على المحور الرأسي Y. فعندما يقوم الباحث بتعريف aes(x = team, y = points) دون تعديل الدالة الإحصائية، يحدث تصادم برمجي يؤدي إلى توقف التنفيذ وظهور رسالة الخطأ المذكورة.

توجد طريقتان قياسيتان لتصحيح هذا الخطأ وضمان التنفيذ السليم:

  • الحل الأول: الاستمرار في استخدام geom_bar() مع التصريح الواضح بالوسيط الإحصائي عبر كتابة geom_bar(stat = "identity")، مما يجبر الدالة على قراءة قيم العمود Y مباشرة.
  • الحل الثاني (وهو الأفضل برمجياً): استخدام الطبقة الهندسية المتخصصة geom_col(). تُعد هذه الدالة بديلاً مباشراً ونظيفاً لـ geom_bar(stat = "identity")؛ حيث صُممت خصيصاً لاستقبال قيم Y الرقمية الجاهزة بشكل افتراضي دون الحاجة إلى كتابة أي وسائط إحصائية إضافية.

11.2 أخطاء تموضع التسميات الرقمية وتداخل النصوص داخل القطاعات

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

يعود السبب الجوهري لهذا الخطأ إلى عدم تطابق الترتيب التجميعي بين طبقة الأشرطة وطبقة النصوص؛ فحتى تتمكن دالة geom_text() من حساب مواقع التراكم الرأسي بدقة متزامنة مع geom_bar()، يجب تمرير نفس وسيط التعبئة أو وسيط التجميع صراحة داخل جماليات النص: aes(label = points, group = position)، مقترناً بالضبط الموضعي position = position_stack(vjust = 0.5).

وعلاوة على ذلك، في الحالات التي تحتوي فيها البيانات على قطاعات ذات قيم مجهرية أو تكرارات صفرية، يؤدي فرض طباعة النص إلى تراكب الأرقام فوق بعضها البعض بشكل مشوه داخل المساحات الضيقة. ويكمن الحل المنهجي في تنقية النصوص قبل الطباعة باستخدام تعبير شرطي داخل دالة الربط، مثل aes(label = ifelse(points > 0, points, ""))، مما يمنع طباعة أي ملصق نصي للقطاعات المنعدمة ويحافظ على نظافة التنسيق البصري للمخطط.

11.3 الإفراط في عدد الفئات وصعوبة المقارنة البصرية للمستويات العليا

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

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

لضمان سلامة الإدراك البصري وتفادي تضليل المتلقي، يجب الالتزام بالقواعد التوجيهية الأكاديمية التالية:

  • حصر استخدام المخططات المكدسة على المتغيرات التي تحتوي على 2 إلى 4 فئات فرعية كحد أقصى لضمان وضوح مساحات القطاعات.
  • دمج الفئات الثانوية ذات التكرارات المحدودة في فئة موحدة عبر دالة forcats::fct_lump().
  • في حال كانت المقارنة التفصيلية بين كافة الفئات الفرعية هي الهدف الأساسي، يجب التخلي فوراً عن المخطط المكدس والتحول إلى المخطط الشريطي المتجاور (Grouped/Dodge Barplot) عبر استخدام position = "dodge"، حيث تستند كافة الأشرطة إلى خط أساس صفري موحد يتيح المقارنة المطلقة المباشرة بدقة متناهية.

12. تصدير الرسوم البيانية بجودة عالية للنشر الأكاديمي والتقارير

12.1 استخدام دالة ggsave() وحفظ الرسوم بدقة Vector و High-DPI

تمثل مرحلة تصدير وحفظ الرسوم البيانية الخطوة الختامية الحاسمة في دورة التحليل البصري؛ حيث إن المخطط المصمم بأعلى درجات الاحترافية يفقد قيمته تماماً إذا تم تصديره بدقة منخفضة تؤدي إلى تشوش النصوص والخطوط عند تضمينه في مسودات الأبحاث أو طباعته على الورق. وتوفر حزمة ggplot2 دالة مخصصة فائقة القوة لإدارة هذه العملية هي دالة ggsave().

تقوم دالة ggsave() تلقائياً بالتقاط آخر مخطط تم عرضه على الشاشة وحفظه في المسار المحدد، مع إتاحة التحكم الكامل في صيغة الملف ودقة الإخراج ووحدات القياس. وتتطلب المعايير الصارمة لدور النشر الأكاديمية العالمية (مثل IEEE و Springer و Nature) تقديم الرسوم البيانية النقطية (Raster) مثل صيغتي TIFF و PNG بدقة وضوح لا تقل عن 300 إلى 600 نقطة في البوصة (DPI – Dots Per Inch).

يتم تنفيذ أمر التصدير عالي الجودة بنقرة واحدة عبر كتابة الشيفرة القياسية: ggsave("figure1_stacked.png", width = 8, height = 6, units = "in", dpi = 300). كما يُفضل في الأوراق البحثية تصدير الرسوم بالصيغ المتجهية (Vector Formats) مثل صيغة PDF أو SVG عبر ggsave("figure1_stacked.pdf", width = 8, height = 6)؛ حيث تضمن هذه الصيغ الهندسية بقاء الخطوط والنصوص واضحة وحادة تماماً عند أي مستوى من مستويات التكبير دون أي فقدان للجودة.

12.2 ضبط المقاسات ونسب العرض إلى الارتفاع (Aspect Ratios)

تؤثر نسب الأبعاد (Aspect Ratios) – أي التناسب الهندسي بين عرض المخطط وارتفاعه – تأثيراً بالغاً على الإدراك البصري لميل وتراكم الأشرطة الشريطية. فالرسم البياني شديد الاتساع أفقياً قد يجعل الأشرطة تبدو متقزمة ومتباعدة بشكل غير متناسق، بينما الرسم شديد الارتفاع رأسياً قد يبالغ بصرياً في تصوير الفروق الطفيفة بين المجاميع.

يجب على الباحث مواءمة الأبعاد الفيزيائية للمخطط مع قالب النشر المستهدف بدقة؛ حيث تُصمم المجلات الأكاديمية تخطيط صفحاتها وفق نظام العمود الواحد (Single-column width وعادة ما يتراوح بين 3.2 إلى 3.5 بوصة) أو نظام العمودين الممتدين (Double-column width ويتراوح بين 6.5 إلى 7 بوصات). ويساعد تحديد وسيطي width و height في ggsave() بما يطابق هذه العروض في تجنب قيام برامج النشر بإعادة تحجيم المخطط بشكل قسري قد يشوه مقاسات الخطوط ووسائل الإيضاح.

كما يُنصح بمعاينة المخطط المصدر بالحجم الطباعي الحقيقي (100% Zoom) للتأكد من أن أحجام الخطوط المختارة في theme() و geom_text() تظل مقروءة بوضوح بالعين المجردة وليست متناهية الصغر أو متضخمة بشكل يطغى على الأشرطة البيانية، مما يضمن خروج البحث في أبهى حلة تنسيقية.

12.3 دمج المخططات في تقارير R Markdown و Quarto

في عصر “البحث العلمي القابل للتكرار” (Reproducible Research)، لم يعد تصدير الرسوم كملفات صور منفصلة ثم لصقها يدوياً في محررات النصوص هو الخيار الأمثل. تتيح أدوات النشر الديناميكي الحديثة مثل R Markdown والجيل الأحدث Quarto كتابة الأكواد التحليلية، وبناء المخططات البيانية المكدسة، وتوليد التقارير النهائية بصيغ HTML و PDF و Microsoft Word في ملف مصدري واحد متكامل ومؤتمت.

داخل مستندات Quarto و R Markdown، يتم التحكم في خصائص المخطط الشريطي المكدس مباشرة عبر خيارات قوالب الأكواد (Chunk Options) المكتوبة في بداية الكتلة البرمجية، ومن أهمها:

  • fig-width: 8 و fig-height: 6: لتحديد أبعاد المخطط المولّد بالبوصة بدقة برمجية.
  • fig-align: "center": لضمان توسط المخطط البياني في منتصف الصفحة المطبوعة أو صفحة الويب.
  • fig-cap: "توزيع النقاط المسجلة للاعبي كرة السلة مقسمة حسب مراكز اللعب والفرق الرياضية": لإضافة تعليق توضيحي وترقيم مرجعي تلقائي للشكل يتيح الإشارة إليه ديناميكياً داخل متن النص (مثل: انظر الشكل 1).
  • dpi: 300: لضمان التوليد المباشر للصور بجودة طباعية كاملة أثناء تصدير المستند النهائي.

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

خاتمة

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

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

المراجع (References)

  • 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
  • Tufte, E. R. (2001). The visual display of quantitative information (2nd ed.). Graphics Press.
  • Wickham, H. (2014). Tidy data. Journal of Statistical Software, 59(10), 1–23. https://doi.org/10.18637/jss.v059.i10
  • Wickham, H. (2016). ggplot2: Elegant graphics for data analysis (2nd ed.). Springer-Verlag New York. https://doi.org/10.1007/978-3-319-24277-4
  • Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for data science: Import, tidy, transform, visualize, and model data (2nd ed.). O’Reilly Media. https://r4ds.hadley.nz/
  • Wilke, C. O. (2019). Fundamentals of data visualization: A primer on making informative and compelling figures. O’Reilly Media.

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

looti, M. (2026, أغسطس 27). كيفية إنشاء مخطط شريطي مكدس في R (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-create-stacked-barplot-in-r-examples/
looti, Mohammed. “كيفية إنشاء مخطط شريطي مكدس في R (مع أمثلة).” عرب سايكلوجي, 27 أغسطس 2026, https://arabpsychology.com/statistics/how-to-create-stacked-barplot-in-r-examples/.
looti, Mohammed. “كيفية إنشاء مخطط شريطي مكدس في R (مع أمثلة).” عرب سايكلوجي. أغسطس 27, 2026. https://arabpsychology.com/statistics/how-to-create-stacked-barplot-in-r-examples/.