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

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

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

تاريخ النشر

تعتبر عملية تمثيل البيانات بصرياً إحدى الركائز الأساسية في دورة التحليل الإحصائي الحديث، حيث تمثل الجسر الرابط بين الأرقام الخام المجردة والرؤى التحليلية العميقة القابلة للتفسير واتخاذ القرارات. وفي بيئة البرمجة الإحصائية المعاصرة، تبرز لغة R Project for Statistical Computing بوصفها المنظومة الأكثر قوة ومرونة لمعالجة البيانات وتصويرها، بفضل بيئتها المفتوحة وتنوع مكتباتها المتخصصة. ويحتل المخطط الشريطي المجمع (Grouped Barplot أو Clustered Bar Chart) مكانة محورية بين أدوات العرض البياني، نظراً لقدرته الفائقة على مقارنة القيم الرقمية وتوزيعاتها عبر مستويات متعددة من المتغيرات الفئوية (Categorical Variables)، مما يجعله أداة لا غنى عنها للباحثين والمحللين في مختلف التخصصات العلمية والتطبيقية.

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

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

1. مقدمة إلى المخططات الشريطية المجمعة (Grouped Barplots) وأهميتها التحليلية

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

يُعرَّف المخطط الشريطي المجمع (Grouped Barplot)، والذي يُطلق عليه أيضاً المخطط الشريطي المتجاور (Side-by-Side Bar Chart)، بأنه تمثيل بياني ثنائي الأبعاد يُستخدم لمقارنة مقياس رقمي مستمر أو تكرار إحصائي عبر فئات متعددة تنتمي إلى متغيرين تصنيفيين نوعيين في آن واحد. وفي هذا النمط من الرسم، يتم تخصيص المحور الأفقي (السيني) للمتغير الفئوي الأساسي، بينما تُقسّم كل فئة رئيسية إلى مجموعة من الأشرطة الفرعية المتلاصقة أو المتقاربة، حيث يمثل كل شريط فرعي مستوىً معيناً من المتغير الفئوي الثانوي، في حين يعبر ارتفاع الشريط على المحور الرأسي (الصادي) عن القيمة الرقمية المقاسة أو التكرار الإحصائي المرتبط بتلك التوليفة المحددة.

لإدراك القيمة التحليلية للمخطط المجمع، يجب إجراء مقارنة منهجية بينه وبين البديل الشائع الآخر وهو المخطط الشريطي المكدس (Stacked Barplot). في المخطط المكدس، يتم وضع الفئات الفرعية فوق بعضها البعض داخل عمود واحد يمثل الفئة الرئيسية، مما يتيح رؤية واضحة للمجموع الكلي الإجمالي للفئة، ولكنه يفرض تحدياً بصرياً وإدراكياً كبيراً عند محاولة مقارنة الفئات الفرعية الداخلية (باستثناء الفئة القاعدية المستندة مباشرة إلى خط الصفر). يعود هذا التشوه البصري إلى غياب خط أساس موحد للمقارنة (Common Baseline)، مما يجعل تقدير الفروق بين الشرائح العلوية مهمة معقدة وغير دقيقة للعين البشرية وفق مبادئ الإدراك البصري في نظرية Gestalt Psychology.

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

Grouped barplot in R
Grouped barplot in R

إن الأهمية المنهجية للمخططات الشريطية المتعددة تبرز بوضوح في تبسيط العلاقات الإحصائية للمجموعات التجريبية ومجموعات المقارنة الضابطة. فعندما تتضمن التجربة العلمية أكثر من عامل تجريبي مستقل (Factorial Design)، يساعد العرض المتجاور في الكشف البصري الفوري عما إذا كان تأثير المتغير الأول يعتمد على مستويات المتغير الثاني، وهو ما يُعرف في التحليل الإحصائي بالتفاعل (Interaction Effect). وبذلك يمهد المخطط الشريطي المجمع الطريق لتفسير نتائج النماذج الخطية العامة واختبارات تحليل التباين ثنائي الاتجاه (Two-Way ANOVA) بصورة بصرية بديهية ومقنعة.

1.2 التطبيقات الإحصائية والبحثية للمخططات المجمعة

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

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

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

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

2. إعداد بيئة العمل وتجهيز هياكل البيانات في لغة R

2.1 تثبيت واستدعاء المكتبات البرمجية الأساسية

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

لتثبيت هذه الحزم في بيئة R، يتم الاعتماد على الدالة القياسية المدمجة من خلال كتابة الأمر البرمجي التالي في وحدة التحكم (Console):

install.packages(“tidyverse”)

أو يمكن تثبيت الحزم المنفصلة بشكل مستقل لتقليل الحجم الكلي للملفات المحملة عبر تثبيت الحزم الأساسية مباشرة:

install.packages(c(“ggplot2”, “dplyr”, “tidyr”, “scales”))

بمجرد اكتمال التثبيت بنجاح من مستودعات الشبكة الشاملة لأرشيف R والمعروفة باسم CRAN (Comprehensive R Archive Network)، يتم استدعاء المكتبات في بداية جلسة التحليل البرمجية باستخدام دالة library، وذلك لإتاحة جميع الدوال والكائنات داخل فضاء العمل الحالي:

library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)

من الضروري التحقق المستمر من توافق إصدارات الحزم المستخدمة، وتجنب تعارض أسماء الدوال (Function Masking) التي قد تنشأ عند تحميل عدة حزم تشترك في بعض المسميات. ولضمان استقرار العمل، يُنصح بتحديث بيئة R وحزمها دورياً عبر استدعاء الأمر update.packages(ask = FALSE). كما يفضل ضبط خيارات العرض الافتراضية داخل بيئة التطوير المتكاملة RStudio Desktop عبر ضبط ترميز النصوص على نظام UTF-8 لضمان المعالجة السليمة للأحرف العربية في العناوين والبيانات التوضيحية دون تشوه أو أخطاء برمجية.

2.2 بناء وتجهيز إطار البيانات (Data Frame) بنمط البيانات الطويلة (Long Format)

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

يمكننا إنشاء إطار بيانات تجريبي نموذجي في R باستخدام دالة data.frame مع الاستعانة بدالتي التكرار rep ودالة الدمج الشعاعي c كما في المثال التالي:

df_sample <- data.frame(
  Department = rep(c(“العلوم”, “الآداب”, “الهندسة”, “الطب”), each = 2),
  Gender = rep(c(“ذكور”, “إناث”), times = 4),
  SatisfactionScore = c(78, 85, 82, 88, 91, 89, 94, 96)
)

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

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

df_wide <- data.frame(
  Department = c(“العلوم”, “الآداب”, “الهندسة”, “الطب”),
  Male = c(78, 82, 91, 94),
  Female = c(85, 88, 89, 96)
)

df_long <- df_wide %>%
  pivot_longer(
    cols = c(“Male”, “Female”),
    names_to = “Gender”,
    values_to = “Score”
  )

بعد تجهيز البنية الطولية، تأتي خطوة التحقق الإلزامي من أنواع المتغيرات (Data Types). يجب التأكد من تحويل المتغيرات المستقلة والتصنيفية إلى عوامل فئوية (Factors) باستخدام دالة as.factor أو factor. تتيح العوامل في R التحكم الصارم في ترتيب ظهور الفئات على المحاور ومفتاح الرسم، ومنع التعامل مع التصنيفات الرقمية (كأرقام المجموعات 1 و2 و3) كمتغيرات كمية مستمرة، مما يضمن تدفقاً برمجياً خالياً من الأخطاء أثناء بناء الطبقات الرسومية.

3. إنشاء مخطط شريطي مجمع أساسي باستخدام حزمة ggplot2

3.1 بناء البنية التأسيسية للرسم بواسطة ggplot وaes

تستند مكتبة ggplot2 في تصميمها إلى النظرية البنيوية التي طورها ليلاند ويلكينسون والمعروفة باسم “قواعد قواعد البيانات الرسومية” (The Grammar of Graphics)، والتي تنص على أن أي رسم بياني هو عبارة عن تركيبة متعددة الطبقات تتألف من بيانات خام، ونظام إحداثيات، وإسقاطات جمالية تربط متغيرات البيانات بالخصائص البصرية، وكائنات هندسية تمثل تلك البيانات مكانياً.

تبدأ الخطوة الأولى في إنشاء المخطط باستدعاء الدالة المحورية ggplot وتمرير إطار البيانات إليها، مع تحديد الإسنادات الجمالية الجوهرية من خلال الدالة المساعدة aes (Aesthetic Mappings). تحدد هذه الإسنادات المتغيرات المسؤولة عن تشكيل البنية المكانية واللونية للرسم:

  • المحور السيني (x): يتم ربطه بالمتغير الفئوي الأساسي الذي سيحدد المجموعات الرئيسية على الخط الأفقي.
  • المحور الصادي (y): يتم ربطه بالمتغير الكمي المستمر الذي يمثل ارتفاع الأشرطة وقيمها الرقمية.
  • لون التعبئة (fill): يتم ربطه بالمتغير الفئوي الثانوي (التجميعي)، وهو الوسيط المسؤول عن تلوين وتقسيم الأشرطة داخل كل فئة رئيسية بصرياً.

تأخذ الشيفرة التأسيسية المبدئية للبنية الرسومية الشكل التالي:

p <- ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender))

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

3.2 إضافة طبقة الأشرطة واستخدام الوسيط position = ‘dodge’

لإظهار الأشرطة على المخطط، تتم إضافة طبقة الكائنات الهندسية الشريطية عبر دمج دالة geom_bar أو دالة geom_col. والافتراضي في دالة geom_bar هو حساب تكرار المشاهدات (stat = ‘count’)، ولكن عندما يحتوي إطار البيانات على القيم الرقمية المحسوبة مسبقاً والمخصصة للمحور الصادي، يجب ضبط الوسيط stat = ‘identity’ داخل geom_bar لإخبار لغة R بقراءة القيم مباشرة من العمود المعين في aes دون إجراء أي عمليات إحصائية إضافية.

إن السلوك التلقائي الافتراضي في ggplot2 عند تعيين متغير تعبئة fill هو تكديس الأشرطة فوق بعضها البعض (position = ‘stack’). ولتحويل المخطط إلى مخطط شريطي مجمع تتجاور فيه الأشرطة جنباً إلى جنب، يتم استخدام الوسيط الجوهري position = ‘dodge’ داخل الطبقة الهندسية، كما هو موضح في الكود التالي:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_bar(stat = “identity”, position = “dodge”)

Grouped barplot in R with ggplot2
Grouped barplot in R with ggplot2

توفر حزمة ggplot2 دالة بديلة ومختصرة وهي geom_col()، والتي تعمل كمعادل وظيفي مباشر للأمر geom_bar(stat = “identity”). تتيح هذه الدالة كتابة شفرة أكثر نظافة وإيجازاً مع الحفاظ على نفس النتيجة البصرية تماماً:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = “dodge”)

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

4. فهم وتعديل آليات التباعد والتجاور (Position Adjustments)

4.1 استخدام دالة position_dodge لتخصيص المسافات بين الأشرطة

على الرغم من أن تمرير السلسلة النصية البسيطة position = “dodge” يؤدي الغرض الأساسي في إنشاء الأشرطة المتجاورة، إلا أنه يفتقر إلى المرونة البرمجية اللازمة للتحكم الدقيق في المسافات الهندسية ومقدار التداخل أو التباعد بين الأشرطة الفرعية. ولتجاوز هذا القصور، توفر مكتبة ggplot2 الدالة الكائنية المتقدمة position_dodge()، والتي تسمح بالتحكم الصارم في إحداثيات التموضع عبر وسائطها المتخصصة.

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

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8))

تتجلى الأهمية القصوى لاستخدام الدالة position_dodge() عند التعامل مع مجموعات بيانات غير متوازنة، أو تلك التي تحتوي على قيم مفقودة (Missing Combinations) لإحدى الفئات الفرعية في بعض المجموعات الرئيسية. فعند استخدام النص البسيط “dodge”، يتمدد الشريط الفردي المتبقي ليأخذ المساحة الكاملة للفئة الرئيسية، مما يحدث تشويهاً بصرياً يوحي للمشاهد بأن الشريط يمثل قيمة مضاعفة. أما عند استخدام position_dodge(preserve = “single”)، فإن R تحافظ على العرض الثابت للأشرطة في جميع المجموعات حتى وإن كانت هناك فئة فرعية مفقودة، مما يحمي النزاهة العلمية للتمثيل البياني.

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

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.9, preserve = “single”))

4.2 التحكم في عرض الأشرطة الفردية (Bar Width)

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

يتم التحكم في سماكة الأشرطة عبر ضبط الوسيط width داخل الدالة الهندسية geom_col() أو geom_bar(). وتتراوح القيمة الافتراضية لعرض الشريط عادة حول 0.9 من إجمالي المساحة المخصصة للفئة على المحور. ومن القواعد التصميمية الحاسمة عند دمج وسيط width مع دالة position_dodge() هي ضرورة مطابقة قيمة التباعد داخل الدالة مع قيمة عرض الشريط، أو جعل قيمة التباعد مساوية لقيمة العرض لتفادي تراكب الأشرطة فوق بعضها البعض بشكل غير مقصود:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(
    width = 0.7,
    position = position_dodge(width = 0.75)
  )

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

5. إنشاء المخططات الشريطية المجمعة باستخدام حزمة Base R

5.1 هيكلة البيانات كمصفوفة أو جدول متقاطع (Contingency Table)

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

بينما تقبل ggplot2 أطر البيانات المنظمة بالصيغة الطويلة (Long Format)، تشترط الدالة الأساسية barplot في Base R تمرير البيانات في صورة مصفوفة رقمية ثنائية الأبعاد (Matrix) أو جدول تقاطع تكراري (Contingency Table). في هذا البناء، تمثل صفوف المصفوفة مستويات المتغير الفئوي الثانوي (الذي سيظهر في المفتاح وداخل المجموعة)، بينما تمثل أعمدة المصفوفة مستويات المتغير الفئوي الأساسي (الذي سيظهر على المحور السيني).

لتحويل إطار بيانات يحتوي على متغيرات تصنيفية إلى مصفوفة صالحة للرسم في Base R، نستخدم إما دالة الجدولة المتقاطعة table أو دالة النمذجة الرياضية xtabs كما يلي:

mat_data <- xtabs(SatisfactionScore ~ Gender + Department, data = df_sample)

يمكن أيضاً إنشاء المصفوفة مباشرة وتسمية صفوفها وأعمدتها عبر الدوال المدمجة matrix وdimnames، والتأكد من صحة أبعادها ونوعها من خلال استدعاء الدوال التشخيصية القياسية:

class(mat_data)
dim(mat_data)
print(mat_data)

ينتج عن هذا التحويل جدول رقمي متقاطع تتحدد فيه بوضوح العلاقة بين الصفوف والأعمدة، وهو الشرط الأساسي الذي تعتمد عليه دالة barplot لتحديد مواقع الأشرطة وتصنيفها اللوني.

5.2 استخدام دالة barplot مع تفعيل الوسيط beside = TRUE

يتم رسم المخططات الشريطية في بيئة R الأساسية عبر استدعاء الدالة barplot(). والسلوك الافتراضي لهذه الدالة عند تمرير مصفوفة ثنائية هو توليد مخطط شريطي مكدس (Stacked Barplot). ولتحويل الرسم إلى مخطط شريطي مجمع تتجاور فيه الأشرطة، يجب تفعيل الوسيط المنطقي الجوهري beside = TRUE.

يوضح المثال البرمجي التالي التطبيق الكامل لإنشاء مخطط شريطي مجمع باستخدام دالة barplot مع تخصيص الألوان، وإضافة مفتاح الرسم، وتسمية المحاور، وضبط حدود المحور الصادي:

barplot(
  height = mat_data,
  beside = TRUE,
  col = c(“#2b5c8f”, “#d95f02”),
  main = “متوسط درجات الرضا حسب القسم والنوع”,
  xlab = “الأقسام الأكاديمية”,
  ylab = “درجة الرضا (من 100)”,
  legend.text = rownames(mat_data),
  args.legend = list(x = “topright”, bty = “n”),
  ylim = c(0, 110)
)

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

6. تخصيص أنظمة الألوان وتعبئة المخططات المجمعة (Color Aesthetics)

6.1 استخدام لوحات الألوان اليدوية بواسطة scale_fill_manual

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

تعتبر الدالة scale_fill_manual() الأداة الأكثر مرونة لتطبيق أنظمة ألوان مخصصة ومحددة يدوياً، حيث يمكن للمحلل تمرير متجهات تحتوي على أسماء الألوان المعيارية في لغة R أو رموز الألوان السداسية عشرية (HEX Codes) لضمان التوافق مع الهوية البصرية للمؤسسة أو المتطلبات الخاصة بالمجلات العلمية:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_manual(
    values = c(“ذكور” = “#1f77b4”, “إناث” = “#ff7f0e”),
    name = “النوع الاجتماعي”,
    labels = c(“ذكور (طلاب)”, “إناث (طالبات)”)
  )

توفر دالة scale_fill_manual أيضاً إمكانية تعديل عنوان مفتاح الرسم (name) وتغيير نصوص التسميات التوضيحية للفئات (labels) مباشرة داخل نفس الدالة دون الحاجة إلى تعديل إطار البيانات الأصلي. ويجب عند اختيار الألوان مراعاة التباين اللوني الكافي (Contrast Ratio) لضمان سهولة التمييز بين الأشرطة المتجاورة حتى عند عرض الرسم على شاشات منخفضة الدقة أو في بيئات إضاءة غير مثالية، محققين بذلك معايير الوصولية الرقمية الشاملة (Web Content Accessibility Guidelines – WCAG).

6.2 تطبيق لوحات ColorBrewer وViridis لتحسين الرؤية والطباعة

بدلاً من تحديد الألوان يدوياً، يفضل في الأبحاث الأكاديمية والتقارير الاحترافية الاعتماد على لوحات ألوان إحصائية معتمدة ومختبرة إدراكياً. ومن أشهر هذه الأنظمة لوحات ColorBrewer المصممة خصيصاً لتصوير البيانات، والتي يمكن تطبيقها مباشرة في ggplot2 عبر الدالة scale_fill_brewer().

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

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_brewer(palette = “Set2”, name = “التصنيف”)

الخيار المتقدم الآخر هو استخدام حزمة لوحات Viridis، والتي صُممت بطريقة رياضية تضمن التدرج البصري المنتظم (Perceptually Uniform). وتتميز هذه اللوحات بخصائص فريدة تجعلها الخيار الذهبي في النشر العلمي الدولي؛ حيث تظل واضحة وقابلة للتمييز تماماً للأشخاص الذين يعانون من مختلف أنواع عمى الألوان (Color Vision Deficiency)، كما أنها تحافظ على تباينها وقابليتها للقراءة عند طباعة المخطط بالأبيض والأسود والتدرج الرمادي (Grayscale).

يتم تطبيق لوحات Viridis على البيانات الفئوية المتقطعة باستخدام الدالة scale_fill_viridis_d() مع إمكانية اختيار خيارات لونية متعددة مثل “viridis” أو “magma” أو “plasma” أو “cividis”:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_viridis_d(option = “cividis”, name = “النوع”)

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

7. تخصيص العناوين، المحاور، ومفتاح الرسم (Labels & Scales)

7.1 إضافة العناوين الرئيسية والفرعية وهوامش البيانات عبر labs

يتطلب الرسم البياني الأكاديمي الرصين سياقاً توضيحياً شاملاً يحول الأشرطة والمحاور إلى وثيقة تحليلية قائمة بذاتها. وفي مكتبة ggplot2، تعد الدالة labs() المركز الرئيسي لإدارة وتنسيق كافة النصوص الوصفية المحيطة بالمخطط، بما في ذلك العنوان الرئيسي (title)، والعنوان الفرعي (subtitle)، وتسميات المحاور الأفقية والعمودية (x وy)، والتذييل أو مصدر البيانات (caption)، وتسمية مفتاح الرسم (fill أو color).

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

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_brewer(palette = “Dark2”) +
  labs(
    title = “مقارنة متوسط درجات الرضا الأكاديمي بين الطلاب والطالبات”,
    subtitle = “دراسة مسحية شملت أربع كليات جامعية خلال الفصل الدراسي الثاني 2024”,
    x = “الكلية / القسم الأكاديمي”,
    y = “متوسط درجة الرضا (0 – 100)”,
    fill = “النوع الاجتماعي”,
    caption = “المصدر: استبانة الجودة والاعتماد الأكاديمي السنوية (ن = 1250)”
  )

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

7.2 التحكم في نطاق وتدرجات المحور الصادي (Continuous Scales)

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

تتيح الدالة scale_y_continuous() في ggplot2 التحكم التام في نطاق المحور وتدرجاته من خلال تحديد الوسائط التالية:

  • limits: لتحديد الحد الأدنى والأقصى للمحور، مثل limits = c(0, 120).
  • breaks: لتعيين مواضع علامات التجزئة والتدرج الرقمي على المحور بدقة، مثل breaks = seq(0, 100, by = 20).
  • expand: للتحكم في المساحة الفاصلة بين قاعدة الأشرطة والخط الأفقي للمحور؛ حيث يُفضل ضبط expand = expansion(mult = c(0, 0.1)) لإلغاء الفراغ السفلي وجعل الأشرطة ترتكز مباشرة على خط الصفر، مع ترك هامش علوي بنسبة 10% لمنع اصطدام الأشرطة بالإطار العلوي للرسم.
  • labels: لتنسيق القيم الرقمية وإضافة الرموز مثل علامات النسبة المئوية أو الفواصل الآلاف، وذلك بالاستعانة بحزمة scales.

يوضح التطبيق البرمجي التالي كيفية توظيف هذه الوسائط لضبط المحور الصادي بصورة احترافية متكاملة:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_brewer(palette = “Set1”) +
  scale_y_continuous(
    limits = c(0, 110),
    breaks = seq(0, 100, 20),
    labels = scales::label_percent(scale = 1),
    expand = expansion(mult = c(0, 0.05))
  )

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

8. إدراج تسميات البيانات الرقمية (Data Labels) فوق الأشرطة

8.1 استخدام geom_text لمحاذاة القيم الرقمية مع الأشرطة المجمعة

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

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

لتحقيق المحاذاة الأفقية الدقيقة، يجب تمرير نفس دالة التباعد المستخدمة في رسم الأشرطة position = position_dodge(width = …) إلى دالة geom_text(). بالإضافة إلى ذلك، يتم استخدام الوسيط vjust (Vertical Justification) للتحكم في الإزاحة الرأسية؛ حيث تؤدي القيمة السالبة (مثل vjust = -0.5) إلى وضع الأرقام أعلى قمة الشريط مباشرة، بينما تؤدي القيمة الموجبة (مثل vjust = 1.5) إلى إدراج الأرقام داخل جسم الشريط تحت الحافة العلوية:

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  geom_text(
    aes(label = round(SatisfactionScore, 1)),
    position = position_dodge(width = 0.8),
    vjust = -0.5,
    size = 3.5,
    fontface = “bold”,
    color = “#333333”
  ) +
  scale_y_continuous(limits = c(0, 110))

من الضروري عند وضع الأرقام أعلى الأشرطة زيادة الحد الأقصى للمحور الصادي (limits) بمقدار مناسب، لتجنب اقتطاع النصوص العلوية عند حافة اللوحة الرسومية.

8.2 استخدام geom_label والتعامل مع التسميات المزدحمة

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

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  geom_label(
    aes(label = SatisfactionScore),
    position = position_dodge(width = 0.8),
    vjust = -0.3,
    size = 3,
    fill = “white”,
    label.padding = unit(0.15, “lines”)
  ) +
  scale_y_continuous(limits = c(0, 115))

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

  • تدوير زاوية النصوص: باستخدام الوسيط angle = 90 أو angle = 45 داخل geom_text لتغيير اتجاه الكتابة وتوفير مساحة أفقية.
  • الترشيح المشروط للتسميات: عن طريق استخدام دالة شرطية مثل ifelse داخل aes(label = …) لعرض القيم الرقمية للقيم القصوى فقط أو الفئات ذات الفروق الإحصائية الجوهرية، مع إخفاء باقي القيم لتجنب الفوضى البصرية.
  • تقليل حجم الخط والتباعد: بضبط الوسيطين size وlabel.size بما يتناسب مع كثافة الأشرطة في المخطط.

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

9. إضافة أشرطة الخطأ وفترات الثقة (Error Bars & Confidence Intervals)

9.1 حساب مقاييس التشتت والخطأ المعياري باستخدام dplyr

في المنهجية الإحصائية والأبحاث التجريبية، لا يكتمل عرض المتوسطات الحسابية دون إرفاقها بمقاييس النزعة المركزية والتشتت الإحصائي المناسبة، مثل الانحراف المعياري (Standard Deviation – SD)، أو الخطأ المعياري للمتوسط (Standard Error – SE)، أو فترات الثقة 95% (95% Confidence Intervals). إن عرض المتوسط بمفرده قد يخفي تبايناً هائلاً داخل العينة، مما قد يقود إلى استنتاجات مضللة حول الفروق بين المجموعات.

قبل إضافة أشرطة الخطأ إلى المخطط البياني في R، يجب تجهيز إطار بيانات ملخص (Summary Data Frame) انطلاقاً من البيانات الخام، باستخدام حزمة dplyr عبر الدوال المتسلسلة group_by() وsummarise(). يوضح الكود التالي كيفية إنشاء بيانات أولية مفصلة وتلخيصها إحصائياً بدقة:

# إنشاء بيانات خام افتراضية لتجربة سلوكية
set.seed(123)
raw_data <- data.frame(
  Condition = rep(c(“تحفيز بصري”, “تحفيز صوتي”, “تحفيز مختلط”), each = 40),
  Group = rep(c(“مجموعة تجريبية”, “مجموعة ضابطة”), each = 20, times = 3),
  ReactionTime = c(
    rnorm(20, mean = 250, sd = 30), rnorm(20, mean = 310, sd = 35),
    rnorm(20, mean = 230, sd = 25), rnorm(20, mean = 290, sd = 40),
    rnorm(20, mean = 210, sd = 20), rnorm(20, mean = 280, sd = 30)
  )
)

# تلخيص الإحصاءات الوصفية وحساب الخطأ المعياري وفترات الثقة
summary_df <- raw_data %>%
  group_by(Condition, Group) %>%
  summarise(
    N = n(),
    Mean = mean(ReactionTime),
    SD = sd(ReactionTime),
    SE = sd(ReactionTime) / sqrt(n()),
    CI_Lower = Mean – qt(0.975, df = n() – 1) * SE,
    CI_Upper = Mean + qt(0.975, df = n() – 1) * SE,
    .groups = “drop”
  )

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

9.2 دمج طبقة geom_errorbar لتمثيل التباين الإحصائي

بعد تجهيز إطار البيانات الملخص، يتم دمج الطبقة الهندسية المخصصة لأشرطة الخطأ وهي geom_errorbar() في سلسلة بناء المخطط. تتطلب هذه الدالة إسناد الحد الأدنى للخطأ ymin والحد الأقصى ymax داخل الدالة aes().

من الأخطاء الشائعة جداً عند إضافة أشرطة الخطأ إلى المخططات الشريطية المجمعة هو نسيان تحديد دالة التباعد position_dodge() داخل طبقة الخطأ، مما يؤدي إلى رسم جميع أشرطة الخطأ في منتصف الفئة فوق بعضها. لذلك، يجب إعطاء وسيط position داخل geom_errorbar نفس قيمة التباعد المحددة في طبقة الأشرطة geom_col تماماً، مع ضبط وسيط عرض أطراف شريط الخطأ width لتكون أضيق بكثير من عرض الشريط الأصلي تجنباً للتشويش البصري:

ggplot(data = summary_df, aes(x = Condition, y = Mean, fill = Group)) +
  geom_col(
    position = position_dodge(width = 0.8),
    width = 0.7,
    color = “black”,
    linewidth = 0.3
  ) +
  geom_errorbar(
    aes(ymin = Mean – SE, ymax = Mean + SE),
    position = position_dodge(width = 0.8),
    width = 0.25,
    linewidth = 0.6,
    color = “#222222”
  ) +
  scale_fill_manual(values = c(“مجموعة تجريبية” = “#4575b4”, “مجموعة ضابطة” = “#d73027”)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = “زمن الاستجابة الحركية تحت ظروف التحفيز الحسي المختلفة”,
    subtitle = “تمثل الأشرطة المتوسط الحسابي ± الخطأ المعياري (Mean ± SE)”,
    x = “نوع التحفيز التجريبي”,
    y = “متوسط زمن الاستجابة (مللي ثانية)”,
    fill = “نوع المجموعة”
  )

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

10. تطبيق السمات الجمالية وتخصيص المظهر (Themes & Styling)

10.1 استخدام السمات الجاهزة وتخصيص نمط العرض الأكاديمي

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

بينما يعتبر المظهر الافتراضي ذو الخلفية الرمادية (theme_grey) مناسباً للاستكشاف الأولي، إلا أنه غير مفضل في النشر الأكاديمي والتقارير المطبوعة. ومن أبرز السمات الجاهزة المعتمدة:

  • theme_minimal(): سمة عصرية وخفيفة تتخلص من الإطارات الثقيلة وتبقي على خطوط الشبكة الأساسية، مما يجعلها مثالية للعروض التقديمية والتقارير الرقمية.
  • theme_classic(): السمة المعيارية المفضلة في النشر العلمي الأكاديمي وفق متطلبات الجمعيات العلمية مثل APA ومجلات Nature وScience؛ حيث تتميز بخلفية بيضاء نقية تماماً، مع خطوط محاور سوداء وإلغاء تام لخطوط الشبكة الخلفية.
  • theme_bw(): مظهر يجمع بين الخلفية البيضاء مع الاحتفاظ بإطار خارجي وخطوط شبكة رمادية فاتحة، وهو مفيد جداً للمخططات الهندسية المعقدة.

بالإضافة إلى ذلك، تقدم حزمة ggthemes مكتبة ثرية من السمات الإضافية المستوحاة من أشهر المطبوعات والمنصات العالمية، مثل سمة مجلة ذا إيكونوميست (theme_economist)، وسمة وول ستريت جورنال (theme_wsj)، وسمة الجمعية الأمريكية لعلم النفس (theme_apa):

library(ggthemes)

ggplot(data = summary_df, aes(x = Condition, y = Mean, fill = Group)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  theme_apa() +
  scale_fill_grey(start = 0.4, end = 0.8)

Grouped barplot in R with ggthemes
Grouped barplot in R with ggthemes

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

10.2 التعديل التفصيلي لعناصر الرسم باستخدام دالة theme

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

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

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = “bold”, size = 14, hjust = 0.5, margin = margin(b = 10)),
    plot.subtitle = element_text(size = 10, hjust = 0.5, color = “gray30”, margin = margin(b = 15)),
    axis.title.x = element_text(face = “bold”, margin = margin(t = 10)),
    axis.title.y = element_text(face = “bold”, margin = margin(r = 10)),
    axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1, color = “black”),
    legend.position = “bottom”,
    legend.title = element_text(face = “bold”),
    legend.background = element_rect(fill = “gray95”, color = NA),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_line(color = “gray85”, linetype = “dashed”),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20)
  )

إن تدوير تسميات المحور السيني باستخدام axis.text.x = element_text(angle = 45) يعتبر حلاً تصميمياً لا غنى عنه عند وجود مسميات طويلة للفئات، حيث يمنع تداخل الكلمات ويحافظ على قابلية القراءة. كما أن نقل مفتاح الرسم إلى الأسفل عبر legend.position = “bottom” يوسع المساحة الأفقية المخصصة للمخطط، مما يجعل التمثيل أكثر تناسقاً وتوازناً.

11. تقنيات متقدمة: التقسيم الشبكي والترتيب وتدوير المحاور

11.1 إعادة ترتيب الفئات بناءً على القيم الرقمية (Reordering Factors)

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

لتحسين الفاعلية الإدراكية للمخطط، يُنصح بإعادة ترتيب مستويات المتغير الفئوي تصاعدياً أو تنازلياً وفقاً للقيم الرقمية المقاسة، وذلك باستخدام دالة reorder() المدمجة في Base R أو دوال حزمة forcats المتخصصة في إدارة العوامل الفئوية داخل منظومة tidyverse مثل fct_reorder():

library(forcats)

# ترتيب الأقسام تنازلياً بناءً على متوسط درجات الرضا
df_reordered <- df_sample %>%
  mutate(Department = fct_reorder(Department, SatisfactionScore, .fun = mean, .desc = TRUE))

ggplot(data = df_reordered, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  scale_fill_brewer(palette = “Set2”)

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

11.2 تدوير المخطط أفقياً وتطبيق التقسيم اللوحي (Faceting)

عندما يحتوي المخطط على عدد كبير من الفئات الرئيسية ذات الأسماء الطويلة جداً التي يصعب قراءتها حتى مع تدوير الخطوط، يصبح الخيار الأفضل هو تحويل المخطط إلى الاتجاه الأفقي (Horizontal Grouped Barplot). في ggplot2 الحديثة، يمكن تحقيق ذلك ببساطة إما بتبديل تعيين المحاور بجعل y = Department وx = SatisfactionScore، أو بإضافة طبقة تدوير نظام الإحداثيات coord_flip():

ggplot(data = df_sample, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  coord_flip() +
  theme_minimal()

تعتبر القراءة الأفقية أكثر طبيعية للعين البشرية عند التعامل مع النصوص الطويلة، وتتيح عرض العشرات من الفئات دون أي ازدحام بصري.

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

تقوم هذه الدوال بتقسيم البيانات إلى مصفوفة من اللوحات البيانية الفرعية الصغيرة والمتجاورة (Small Multiples)، حيث تشترك جميع اللوحات في نفس المقاييس والمحاور لتسهيل المقارنة المتقاطعة:

# إضافة متغير افتراضي للسنة الدراسية
df_multi <- rbind(
  transform(df_sample, Year = “2023”),
  transform(df_sample, Year = “2024”, SatisfactionScore = SatisfactionScore * runif(8, 0.9, 1.1))
)

ggplot(data = df_multi, aes(x = Department, y = SatisfactionScore, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  facet_wrap(~ Year, ncol = 2) +
  theme_bw() +
  scale_fill_brewer(palette = “Accent”) +
  labs(title = “تطور درجات الرضا حسب القسم والنوع عبر عامين متتاليين”)

توفر هذه التقنية المتقدمة قدرة استثنائية على تفكيك التعقيد في البيانات متعددة الأبعاد وعرضها في قوالب بصرية متسقة ومنظمة تسهل المقارنة والتحليل المعمق.

12. أفضل الممارسات، معالجة الأخطاء، وتصدير المخططات بجودة عالية

12.1 معالجة الأخطاء والمشكلات البرمجية الشائعة

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

من أبرز هذه المشكلات:

  • تراكم الأشرطة فوق بعضها: يحدث هذا الخطأ عند نسيان تضمين وسيط position = “dodge” داخل geom_col() أو geom_bar()، مما يعيد الرسم إلى الوضع التلقائي المكدس (Stacking). الحل هو التأكد دائماً من تمرير وسيط التجاور المناسب.
  • تشوه أشرطة الخطأ وتمركزها في الوسط: ينتج عن عدم تحديد نفس قيمة position_dodge() لطبقة geom_errorbar() كما أشرنا سابقاً. يجب مطابقة قيم width بدقة متناهية بين الطبقتين.
  • اختفاء الأشرطة أو ظهور فراغات غامضة: يعود سببها غالباً إلى وجود قيم مفقودة (NA Values) داخل إطار البيانات، مما يؤدي إلى استبعاد المشاهدات بصمت أو إطلاق تحذيرات برمجية. يُعالج ذلك بتنظيف البيانات مسبقاً عبر دالة drop_na() من حزمة tidyr أو معالجة القيم المفقودة صراحة.
  • الأخطاء الناتجة عن أنواع الأعمدة غير المتوافقة: مثل تمرير متغير رقمي متصل إلى وسيط fill بدلاً من عامل فئوي (Factor)، مما يؤدي إلى توليد شريط تدرج لوني مستمر بدلاً من ألوان متباينة للأشرطة المنفصلة. الحل هو تغليف المتغير بدالة as.factor().

تساعد خطوات استكشاف الأخطاء البرمجية (Debugging) المتسلسلة، مثل فحص بنية البيانات بواسطة str(df) وتفحص أولى الصفوف عبر head(df)، في اكتشاف وتصحيح هذه التناقضات قبل البدء في مراحل التصميم النهائي.

12.2 تصدير المخططات بجودة فائقة للنشر والطباعة عبر ggsave

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

تتيح دالة ggsave() حفظ المخطط بصيغ متعددة تتناسب مع الغرض المستهدف:

  • الرسوم الشعاعية المتجهية (Vector Graphics): مثل صيغ PDF وSVG وEPS. وتعتبر الخيار الأمثل والمفضل لمجلات النشر العلمي والطباعة الورقية، نظراً لأنها تحافظ على دقتها ووضوح خطوطها اللانهائي عند التكبير دون أي تشوه أو بكسلة (Pixelation).
  • الرسوم النقطية (Raster Graphics): مثل صيغ PNG وTIFF وJPEG. وتستخدم للعروض التقديمية والمنصات الرقمية ومواقع الويب.

لضمان تلبية متطلبات المجلات العلمية المصنفة دولياً (مثل معايير IEEE وElsevier وSpringer)، يجب ضبط دقة الصورة النقطية على 300 أو 600 نقطة في البوصة (DPI – Dots Per Inch) مع تحديد الأبعاد الفيزيائية الدقيقة للرسم بالسنتيمتر أو البوصة، كما يوضح المثال البرمجي التالي:

final_plot <- ggplot(data = summary_df, aes(x = Condition, y = Mean, fill = Group)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  geom_errorbar(aes(ymin = Mean – SE, ymax = Mean + SE), position = position_dodge(width = 0.8), width = 0.2) +
  theme_classic(base_size = 12) +
  scale_fill_brewer(palette = “Set1”) +
  labs(x = “المجموعة التجريبية”, y = “المتوسط الحسابي”, fill = “التصنيف”)

# تصدير كملف متجهي عالي الدقة للنشر الأكاديمي (PDF)
ggsave(
  filename = “figures/Figure1_APA.pdf”,
  plot = final_plot,
  width = 18,
  height = 12,
  units = “cm”,
  device = cairo_pdf
)

# تصدير كصورة نقطية فائقة الدقة للطباعة (TIFF 600 DPI)
ggsave(
  filename = “figures/Figure1_HighRes.tiff”,
  plot = final_plot,
  width = 7,
  height = 5,
  units = “in”,
  dpi = 600,
  compression = “lzw”
)

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

خاتمة

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

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

References

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

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