11 التواصل وعرض النتائج
11.1 مقدمة
في الفصل 10، تعلمت كيفية استخدام المخططات البيانية كأدوات لـ الاستكشاف. وعندما كنت تبني مخططات استكشافية، كنت تعرف مسبقاً — حتى قبل النظر إلى الرسم — ما هي المتغيرات التي سيتم عرضها. لقد أنشأت كل مخطط لغرض محدد، لتلقي عليه نظرة سريعة ثم تنتقل مباشرة إلى المخطط التالي. وفي مسار معظم التحليلات الإحصائية، ستنتج العشرات أو المئات من المخططات، والتي يتم التخلص من معظمها على الفور.
أما الآن، وبعد أن فهمت بياناتك واستخلصت معالمها الكامنة، فقد حان الوقت لـ التواصل ونقل هذا الفهم إلى الآخرين. ومن المحتمل جداً ألا يمتلك جمهورك المستهدف نفس خلفيتك المعرفية، ولن يكونوا مستثمرين بعمق في تفاصيل البيانات الخام. ومساعدتهم على بناء نموذج ذهني صحيح وسريع للبيانات، يتطلب منك بذل جهد كبير لجعل المخططات البيانية مفسرة لذاتها (Self-explanatory) قدر الإمكان. وسوف تتعلم في هذا الفصل بعض الأدوات المتقدمة التي توفرها حزمة ggplot2 لتحقيق ذلك.
يركز هذا الفصل على الأدوات البرمجية والهندسية التي تحتاجها لإنشاء رسومات بيانية عالية الجودة وعروض تقريرية متميزة. ونحن نفترض هنا أنك تعرف تماماً ما تريد عرضه، وتحتاج فقط إلى معرفة كيفية تنفيذه برمجياً. ولهذا السبب، نوصي بشدة بقرائن هذا الفصل مع كتاب مرجعي عام وجيد في مجال تمثيل البيانات؛ ونفضل بشكل خاص كتاب الفن الصادق للمؤلف ألبرت كايرو (Albert Cairo)؛ فهو لا يعلمك الآليات البرمجية لإنشاء المخططات، بل يركز بعمق على الجوانب الفكرية والمنهجية التي يجب أن تفكر فيها لإنتاج رسومات بيانية فعالة ومؤثرة.
11.1.1 المتطلبات المسبقة
في هذا الفصل، سينصبّ تركيزنا مرة أخرى على حزمة ggplot2. سنستخدم أيضاً القليل من حزمة dplyr لمعالجة البيانات، وحزمة scales لتجاوز قيم الفواصل (breaks)، والتسميات (labels)، والتحويلات، ولوحات الألوان الافتراضية. بالإضافة إلى ذلك، سنستعين ببعض الحزم الامتدادية لـ ggplot2، بما في ذلك حزمة ggrepel (https://ggrepel.slowkow.com) من تطوير كاميل سلوفيكوفسكي (Kamil Slowikowski)، وحزمة patchwork (https://patchwork.data-imaginist.com) من تطوير توماس لين بيدرسن (Thomas Lin Pedersen). لا تنسَ أنك ستحتاج إلى تثبيت هذه الحزم باستخدام الدالة install.packages() إذا لم تكن مثبتة لديك بالفعل.
11.2 العناوين والبطاقات التعريفية (Labels)
إن أسهل نقطة للبدء عند تحويل الرسم البياني الاستكشافي إلى رسم بياني تفسيري تقريري هي صياغة عناوين وبطاقات تعريفية جيدة ومفسرة. ويمكنك إضافة هذه العناوين باستخدام دالة labs().
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class)) +
geom_smooth(se = FALSE) +
labs(
x = "الإزاحة الحجمية للمحرك (لتر)",
y = "كفاءة استهلاك الوقود على الطرق السريعة (ميل/غالون)",
color = "نوع السيارة",
title = "كفاءة استهلاك الوقود تنخفض عموماً مع زيادة حجم المحرك",
subtitle = "السيارات ذات المقعدين (الرياضية) تشكل استثناءً بسبب خفة وزنها",
caption = "fueleconomy.gov البيانات مستمدة من موقع"
)
إن الغرض الأساسي من عنوان المخطط البياني هو تلخيص النتيجة الجوهرية المستخلصة. ولذلك، تجنب تماماً العناوين التقليدية اللفظية التي تقتصر على وصف مكونات الرسم فقط، مثل: “مخطط تشتت يوضح حجم المحرك مقابل كفاءة الوقود”.
وإذا كنت بحاجة إلى إضافة المزيد من النصوص التوضيحية، فهناك بطاقتان تعريفيتا مفيدتان للغاية: العنوان الفرعي subtitle والذي يضيف تفاصيل إضافية بخط أصغر أسفل العنوان الرئيسي، والتعليق السفلي caption الذي يضيف نصاً في أسفل يمين المخطط، ويُستخدم عادةً لتوثيق مصدر البيانات الإحصائية. يمكنك أيضاً استخدام دالة labs() لاستبدال أسماء المحاور ومفاتيح الرسم؛ حيث يُعد من الممارسات المنهجية الجيدة استبدال أسماء المتغيرات المختصرة بأوصاف تفصيلية دقيقة مع تضمين وحدات القياس المستخدمة.
ومن المزايا المتقدمة أيضاً، إمكانية استخدام المعادلات الرياضية (Mathematical equations) بدلاً من سلاسل النص العادية؛ وكل ما عليك فعله هو استبدال علامات التنصيص "" بدالة الاقتباس البرمجية quote() والاطلاع على الخيارات الرياضية المتاحة عبر كتابة الأمر ?plotmath:

11.2.1 تمارين
أنشئ مخططاً بيانياً واحداً باستخدام بيانات كفاءة استهلاك الوقود مع تخصيص كل من العناوين التالية:
title،subtitle،caption، والمحاورxوy، ومفتاح الألوانcolor.-
أعد إنتاج وبناء المخطط البياني التالي باستخدام بيانات كفاءة استهلاك الوقود. لاحظ أن ألوان النقاط وأشكالها (Shapes) تتغير معاً بناءً على نوع نظام الدفع.

اختر رسماً بيانياً استكشافياً قمت بإنشائه خلال الشهر الماضي، وأضف إليه عناوين تفسيرية ومعرفية واضحة ومحددة لتسهيل فهمه وتفسيره من قبل زملائك أو الباحثين الآخرين.
11.3 التعليقات التوضيحية (Annotations)
بالإضافة إلى وضع العناوين على المكونات الرئيسية للمخطط، من المفيد جداً تمييز وتسمية مشاهدات فردية محددة أو مجموعات معينة من المشاهدات. والأداة الأولى المتاحة تحت تصرفك لتحقيق ذلك هي الدالة الهندسية geom_text()؛ geom_text() تشبه الدالة الشهيرة geom_point() ولكنها تمتلك خاصية بيانية جمالية إضافية وهي: label؛ مما يجعل من الممكن إضافة نصوص توضيحية مباشرة داخل المخطط.
وثمة مصدران لتوليد هذه البيانات النصية التوضيحية؛ أولاً: قد يكون لديك إطار بيانات أو تيبِل tibble مخصص يحتوي على النصوص المراد عرضها. في المخطط التالي، سوف نقوم باستخلاص السيارات التي تمتلك أكبر حجم محرك داخل كل فئة من فئات نظام الدفع، ونحفظ بياناتها في إطار بيانات جديد نطلق عليه اسم label_info:
label_info <- mpg |>
group_by(drv) |>
arrange(desc(displ)) |>
slice_head(n = 1) |>
mutate(
drive_type = case_when(
drv == "f" ~ "دفع أمامي",
drv == "r" ~ "دفع خلفي",
drv == "4" ~ "دفع رباعي"
)
) |>
select(displ, hwy, drv, drive_type)
label_info
#> # A tibble: 3 × 4
#> # Groups: drv [3]
#> displ hwy drv drive_type
#> <dbl> <int> <chr> <chr>
#> 1 6.5 17 4 دفع رباعي
#> 2 5.3 25 f دفع أمامي
#> 3 7 24 r دفع خلفيبعد ذلك، نستخدم إطار البيانات الجديد هذا لوضع المسميات النصية مباشرة فوق المجموعات الثلاث كبديل ذكي لمفتاح الرسم التقليدي (Legend). ومن خلال وسيطي الخط وحجم النص fontface و size، يمكننا تخصيص مظهر الكلمات لتظهر بحجم أكبر وأكثر سمكاً (Bold). (علماً بأن الأمر theme(legend.position = "none") يقوم بإخفاء مفاتيح الرسم تماماً — وسنتحدث عن هذه الخصائص بالتفصيل بعد قليل).
ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
geom_point(alpha = 0.3) +
geom_smooth(se = FALSE) +
geom_text(
data = label_info,
aes(x = displ, y = hwy, label = drive_type),
fontface = "bold", size = 5, hjust = "right", vjust = "bottom"
) +
theme(legend.position = "none")
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
لاحظ استخدام وسيطي المحاذاة الأفقية hjust والمحاذاة الرأسية vjust للتحكم الدقيق في موضع وضبط النص التوضيحي بالنسبة لنقطة البيانات.
ومع ذلك، فإن المخطط الموضح أعلاه قد يكون صعب القراءة نظراً لتداخل النصوص التوضيحية مع بعضها البعض أو مع النقاط الأساسية للبيانات. ولحل هاتين المشكلتين معاً بشكل تلقائي وذكي، يمكننا الاستعانة بالدالة المتطورة geom_label_repel() من حزمة ggrepel ؛ حيث تقوم هذه الحزمة المتميزة بضبط وتوزيع مواقع النصوص تلقائياً لمنع أي تداخل بصري:
ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
geom_point(alpha = 0.3) +
geom_smooth(se = FALSE) +
geom_label_repel(
data = label_info,
aes(x = displ, y = hwy, label = drive_type),
fontface = "bold", size = 5, nudge_y = 2
) +
theme(legend.position = "none")
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ويمكنك تطبيق ذات الفكرة المنهجية لإبراز وتسليط الضوء على نقاط معينة شاذة أو حرجة في الرسم باستخدام الدالة geom_text_repel(). ولاحظ هنا تقنية هندسية رائعة أخرى: حيث قمنا بإضافة طبقة ثانية من النقاط الكبيرة المفرغة (Hollow points) لتطويق وتحديد النقاط المميزة والمصنفة نصياً لمزيد من التأكيد البصري.
potential_outliers <- mpg |>
filter(hwy > 40 | (hwy > 20 & displ > 5))
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
geom_text_repel(data = potential_outliers, aes(label = model)) +
geom_point(data = potential_outliers, color = "red") +
geom_point(
data = potential_outliers,
color = "red", size = 3, shape = "circle open"
)
وتذكر دائماً أنه بالإضافة إلى دالتي geom_text() و geom_label()، تضع حزمة ggplot2 بين يديك العديد من الدوال الهندسية والطبقات الأخرى لمساعدتك في وضع التعليقات التوضيحية على مخططاتك البحثية؛ ومنها على سبيل المثال:
استخدام دالتي الخطوط المرجعية
geom_hline()وgeom_vline()لإضافة خطوط إرشادية ثابتة. ونحن نفضل جعلها عريضة نسبياً (linewidth = 2) وبيضاء اللون (color = white) مع رسمها أسفل طبقة البيانات الأساسية لتسهيل رؤيتها دون أن تشتت الانتباه عن النمط العام للبيانات.استخدام الدالة المستطيلة
geom_rect()لرسم إطار حول منطقة محددة تتركز فيها نقاط الاهتمام؛ ويتم تحديد حدود هذا المستطيل عبر الخصائص الإحداثيةxminوxmaxوyminوymax. وبدلاً من ذلك، يمكنك استكشاف حزمة ggforce المتقدمة، وتحديداً دالةgeom_mark_hull()والتي تسمح لك بتطويق وتسييج المجموعات الفرعية من البيانات بشكل منحني ودقيق.استخدام دالة القطع المستقيمة
geom_segment()مع وسيط الأسهمarrowلتوجيه انتباه القارئ نحو نقطة معينة باستخدام سهم إرشادي؛ حيث تحدد الخصائصxوyموقع بداية السهم، بينما تحدد الخصائصxendوyendموقع نهايته المستهدفة.
ومن الدوال السريعة والعملية للغاية لإضافة عناصر تفسيرية مستقلة هي دالة annotate(). وكقاعدة عامة موجهة: تُستخدم الدوال الهندسية (Geoms) عادةً لإبراز مجموعات فرعية كاملة مشتقة من البيانات، بينما تُعد دالة annotate() الخيار الأمثل والأنسب لإضافة عنصر توضيحي فردي أو بضعة عناصر معزولة إلى المخطط البياني دون الحاجة لإنشاء إطار بيانات مستقل لها.
ولاستعراض كيفية توظيف دالة annotate()، دعنا ننشئ نصاً تفسيرياً طويلاً نسبياً لتضمينه في مخططنا. وسنعتمد على دالة المعالجة النصية stringr::str_wrap() لإضافة كسر أسطر تلقائي بناءً على عدد الحروف المحددة لكل سطر لتفادي امتداد النص خارج حدود الرسم:
trend_text <- "أحجام المحركات الكبيرة تميل عموماً إلى تسجيل كفاءة أقل في استهلاك الوقود." |>
str_wrap(width = 30)
trend_text
#> [1] "أحجام المحركات الكبيرة تميل\nعموماً إلى تسجيل كفاءة أقل في\nاستهلاك الوقود."بعد ذلك، نضيف طبقتين من التعليقات التوضيحية (annotations): إحداهما باستخدام دالة هندسية للتسميات (label geom)، والأخرى باستخدام دالة هندسية للقطع المستقيمة (segment geom). تحدد الخصائص الجمالية x و y في كلتا الطبقتين نقطة بداية التعليق التوضيحي، بينما تحدد الخصائص الجمالية xend و yend في طبقة القطعة المستقيمة موقع نهاية هذه القطعة. لاحظ أيضاً أن القطعة المستقيمة قد تم تنسيقها على شكل سهم.

إن التعليقات والبطاقات التوضيحية تمثل أداة بالغة القوة والـتأثير لتوصيل المخرجات الجوهرية والخصائص الفريدة لتصاميمك البصرية وإحصاءاتك الحيوية. والحدود الوحيدة لتوظيفها هي مخيلتك (ومدى صبرك ودقتك في ضبط المواقع الإحداثية لتخرج اللوحة في أبهى صورة أكاديمية ممكنة)!
11.3.1 تمارين
استخدم الدالة
geom_text()مع تمرير القيم اللانهائية لتحديد المواضع الإحداثية، ووضع نصوص توضيحية عند الأركان الأربعة للمخطط البياني بدقة.استخدم الدالة
annotate()لإضافة نقطة هندسية (point geom) في منتصف آخر مخطط بياني قمت برسمه، دون الحاجة إلى إنشاء إطار بيانات من نوع tibble. قم بتخصيص شكل النقطة، أو حجمها، أو لونها.كيف تتفاعل التسميات النصية المضافة عبر الدالة
geom_text()مع المخططات المقسمة إلى لوحات فرعية (Faceting)؟ وكيف يمكنك إضافة مسمى نصي إلى لوحة فرعية واحدة فقط؟ وكيف يمكنك وضع مسمى نصي مختلف تماماً داخل كل لوحة فرعية؟ (إرشاد: فكر ملياً في بنية وتصميم مجموعة البيانات التي يتم تمريرها إلى الدالةgeom_text()).ما هي الوسائط والخيارات البرمجية في الدالة
geom_label()التي تتحكم في المظهر البصري للصندوق الخلفي المحيط بالنص؟ما هي الوسائط الأربعة الأساسية الممررة للدالة التوجيهية
arrow()؟ وكيف تعمل كل منها؟ أنشئ سلسلة من المخططات البيانية التي تستعرض وتوضح الخيارات الأكثر أهمية.
11.4 المقاييس (Scales)
الركيزة الثالثة والأساسية التي يمكنك الاعتماد عليها لتحسين المخطط البياني وتطوير كفاءته التفسيرية والتقريرية هي ضبط وتعديل المقاييس البيانية (Scales)؛ حيث تتحكم هذه المقاييس في كيفية تحويل وتجسيد الخصائص والروابط البيانية الجمالية (Aesthetic mappings) إلى مخرجات بصرية ملموسة ومرئية.
11.4.1 المقاييس الافتراضية (Default scales)
في الحالات العادية، تقوم حزمة ggplot2 بإضافة المقاييس البيانية تلقائياً وراء الكواليس دون تدخل مباشر منك. على سبيل المثال، عندما تكتب الكود التالي لإنشاء المخطط:
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class))فإن حزمة ggplot2 تقوم تلقائياً بتضمين وبناء مقاييس افتراضية مكملة للهيكل البرمجي وكأنك كتبت الآتي تماماً:
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class)) +
scale_x_continuous() +
scale_y_continuous() +
scale_color_discrete()ولاحظ هنا آلية التسمية المنتظمة والمنهجية للمقاييس البيانية: حيث تبدأ دائماً بالسابقة scale_ متبوعة باسم الخاصية الجمالية المستهدفة، ثم شرطة سفلية _، تليها التسمية الخاصة بنوع المقياس الإحصائي الكامن. وتتحدد أسماء المقاييس الافتراضية بناءً على طبيعة ونوع المتغير الذي تتطابق معه: متصل (Continuous)، متقطع منفصل (Discrete)، تاريخ ووقت (Datetime)، أو تاريخ (Date). فالدالة scale_x_continuous() تقوم بتمثيل القيم العددي للمتغير المحوري displ على خط أعداد متصل ومستمر على المحور السيني، بينما تتولى الدالة scale_color_discrete() اختيار وتوزيع الألوان المتقاطعة لكل فئة من فئات نوع السيارة class الكامنة، وهكذا. وهناك العديد من المقاييس غير الافتراضية المتقدمة التي ستتعلم كيفية توظيفها بالأسفل.
وقد تم اختيار وتصميم المقاييس الافتراضية بعناية فائقة لتقدم أداءً إحصائياً ممتازاً ومناسباً لمدى واسع جداً من المدخلات والبيانات. ومع ذلك، قد ترغب في إلغاء هذه الإعدادات الافتراضية والتدخل لتعديلها يدوياً لسببين رئيسيين وعلميين هما:
الرغبة في تحسين وتعديل بعض الوسائط والمعالم الدقيقة للمقياس الافتراضي؛ مما يتيح لك تغيير مواضع علامات الفواصل الفترية (Breaks) على المحاور، أو تعديل المسميات التعريفية للمفاتيح داخل مربعات التوضيح (Legend).
الرغبة في استبدال المقياس البياني بالكامل، والاعتماد على خوارزمية أو أسلوب رياضي مختلف تماماً في التمثيل؛ فالكثير من الأحيان يمكنك إنتاج عرض بصري أفضل وأعمق بناءً على معرفتك النظرية المسبقة بطبيعة وخصائص توزيع البيانات لديك.
11.4.2 علامات المحاور ومفاتيح الرسم (Axis ticks and legend keys)
تُعرف المحاور البيانية ومفاتيح ومربعات الرسم التوضيحية إحصائياً وبصرياً باسم الأدلة الإرشادية (Guides)؛ حيث تُستخدم المحاور كأدلة مرجعية للخصائص الإحداثية على المحورين السيني والصادي (x و y)، بينما تُوظف مفاتيح ومربعات الرسم لشرح وتفسير بقية الخصائص الجمالية الأخرى المعروضة كالألوان والأشكال.
وهناك وسيطان برمجيا جوهريان ومحوريان يؤثران بشكل مباشر على المظهر العام للعلامات الفاصلة على المحاور والمفاتيح في مربعات الرسم، وهما: breaks و labels. حيث يتحكم الوسيط الفتري breaks في تحديد المواضع الدقيقة للعلامات الفاصلة على المحور أو القيم المرتبطة بالمفاتيح التوضيحية. بينما يتولى الوسيط التعريفي labels التحكم في النصوص والكلمات المصاحبة لكل علامة أو مفتاح مرسوم. والاستخدام الأكثر شيوعاً وعملية للوسيط breaks يكمن في تعديل وإلغاء الخيارات التلقائية للمقياس:
ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
scale_y_continuous(breaks = seq(15, 40, by = 5)) 
ويمكنك استخدام الوسيط labels بذات الطريقة تماماً عبر تمرير متجه نصي (Character vector) يمتلك نفس طول المتجه الممرر للوسيط breaks. كما يمكنك أيضاً تعيين قيمته لتكون فارغة تماماً NULL لإخفاء التسميات والمسميات الرقمية بالكامل من على المحاور؛ وهو أمر بالغ الفائدة والأهمية عند رسم الخرائط الجغرافية، أو عند إعداد مخططات بيانية معدة للنشر الأكاديمي حيث لا يُسمح بمشاركة وعرض القيم والأرقام الخام المطلقة حرصاً على سرية البيانات. بالإضافة إلى إمكانية توظيف دالتي breaks و labels للتحكم الدقيق في مظهر مفاتيح الرسم ومربعات التوضيح؛ ففي المقاييس المتقطعة الخاصة بالمتغيرات الفئوية والنوعية، يمكن أن يكون الوسيط labels عبارة عن قائمة مسماة (Named list) تربط بين الأسماء الأصلية للمستويات وبين المسميات الجديدة المرغوب في إظهارها:
ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
scale_x_continuous(labels = NULL) +
scale_y_continuous(labels = NULL) +
scale_color_discrete(labels = c("4" = "رباعي", "f" = "أمامي", "r" = "خلفي"))
ويُعد تضافر الوسيط التعريفي labels مع الدوال التنسيقية المتقدمة المتاحة في حزمة scales أسلوباً برمجياً شديد القوة والاحترافية لتنسيق الأرقام وعرضها على هيئة عملات نقدية، أو نسب مئوية، وغيرها من الصيغ الرياضية. يظهر المخطط البياني على جهة اليسار التنسيق الافتراضي باستخدام دالة label_dollar()، والتي تضيف تلقائياً علامة العملة بالإضافة إلى فاصلة الآلاف التنظيمية. بينما يقدم المخطط على جهة اليمين تخصيصاً وتعديلاً أكثر عمقاً عبر قسمة القيم المالية على 1,000 وإضافة اللاحقة النصية “K” (والتي ترمز إلى الآلاف) مع بناء فواصل مخصصة ومحددة. ولاحظ هنا أن وسيط الفواصل breaks يتم تمريره دائماً بالمقياس والأرقام الأصلية الخام للبيانات دون تغيير:
# المخطط الأيسر
ggplot(diamonds, aes(x = price, y = cut)) +
geom_boxplot(alpha = 0.05) +
scale_x_continuous(labels = label_dollar())
# المخطط الأيمن
ggplot(diamonds, aes(x = price, y = cut)) +
geom_boxplot(alpha = 0.05) +
scale_x_continuous(
labels = label_dollar(scale = 1/1000, suffix = "K"),
breaks = seq(1000, 19000, by = 6000)
)

ومن الدوال التنسيقية الجمالية والعملية للغاية أيضاً دالة النسب المئوية label_percent():
ggplot(diamonds, aes(x = cut, fill = clarity)) +
geom_bar(position = "fill") +
scale_y_continuous(name = "النسبة المئوية", labels = label_percent())
وثمة استخدام منهجي متميز لوسيط الفواصل breaks يبرز عندما تكون لديك نقاط بيانات ومقاييس محدودة وقليلة نسبياً، وتريد تسليط الضوء بدقة فائقة على مواضع وقوع وتكرار تلك المشاهدات الفعلية. ولنأخذ على سبيل المثال هذا المخطط المتميز الذي يعرض تواريخ بداية ونهاية الفترات الرئاسية لعدد من رؤساء الولايات المتحدة الأمريكية:
presidential |>
mutate(id = 33 + row_number()) |>
ggplot(aes(x = start, y = id)) +
geom_point() +
geom_segment(aes(xend = end, yend = id)) +
scale_x_date(name = NULL, breaks = presidential$start, date_labels = "'%y")
لاحظ أننا في وسيط الفواصل breaks قمنا باستخلاص متغير البداية start كمتجه مستقل ومباشر عبر الصيغة التركيبية presidential$start؛ وذلك لأننا لا نستطيع إجراء مطابقة بيانية جمالية (Aesthetic mapping) داخل هذا الوسيط تحديداً. ولاحظ أيضاً أن صياغة وتحديد الفواصل والعناوين في المقاييس الخاصة بالتاريخ والتاريخ والوقت (Date and datetime scales) تختلف قليلاً وتتبع القواعد التالية:
يستقبل الوسيط
date_labelsمواصفات وصيغ التنسيق النصي للزمن، بذات الأسلوب والطريقة المتبعة في دالة التحليل الزمني الشهيرةparse_datetime().يستقبل الوسيط
date_breaks(والذي لم يتم عرضه في هذا الكود)، سلاسل نصية زمنية منتظمة مثل لتعيين فواصل كل يومين، أو لتعيين فواصل شهرية متسقة.
11.4.3 تنسيق وتوزيع مفاتيح الرسم (Legend layout)
في معظم الأحيان، ستستخدم دالتي breaks و labels لإجراء تحسينات وتعديلات على المحاور الإحداثية. وعلى الرغم من أنهما تعملان بكفاءة تامة أيضاً مع مفاتيح ومربعات الرسم التوضيحية، إلا أن هناك تقنيات ومنهجيات أخرى متطورة يفضل الاعتماد عليها لتنسيق عروض اللوحات التوضيحية المرافقة للمخططات.
وللتحكم في الموضع الجغرافي العام لمربع التوضيح والمفاتيح، يتعين عليك الاعتماد على إعدادات دالة المظهر العام theme(). وسوف نعود لمناقشة السمات والمظاهر (Themes) بالتفصيل في نهاية هذا الفصل، ولكن باختصار، هي المسؤولة عن التحكم في كافة المكونات الجمالية والرسومية غير المرتبطة بالبيانات مباشرة في المخطط. حيث يتحكم وسيط الموضع legend.position في تحديد مكان رسم وعرض مربع التوضيح المرجعي لبياناتك:
base <- ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class))
base + theme(legend.position = "right") # الموضع الافتراضي التلقائي حزمة
base + theme(legend.position = "left")
base +
theme(legend.position = "top") +
guides(color = guide_legend(nrow = 3))
base +
theme(legend.position = "bottom") +
guides(color = guide_legend(nrow = 3))



وكقاعدة تنسيقية وتوجيهية توفر لك عروضاً بصرية متميزة: إذا كان مخططك البياني عريضاً وقصيراً في أبعاده، فقم بوضع مربع التوضيح في الأعلى أو الأسفل، وإذا كان المخطط طويلاً ونحيلاً، فقم بنقل المربع إلى الجانب الأيمن أو الأيسر. كما يمكنك استخدام الخيار legend.position = "none" لإخفاء ومنع ظهور مربع التوضيح والمفاتيح بالكامل من على لافحة الرسم.
وللتحكم الدقيق والمستقل في طريقة عرض كل دليل أو مفتاح توضيحي على حدة، يمكنك الاعتماد على دالة الأدلة guides() بالتعاون مع دالة المفاتيح الفئوية guide_legend() أو دالة المفاتيح المتصلة guide_colorbar(). ويستعرض المثال التالي إعدادين بالغي الأهمية والفائدة: أولاً، التحكم في عدد الصفوف التوضيحية التي يشغلها مربع التوضيح عبر الوسيط السطري nrow، وثانياً، إلغاء وتعديل إحدى الخصائص الجمالية لتكبير حجم النقاط. وتبرز القيمة السيكومترية والإحصائية لهذه التقنية بوضوح إذا كنت قد استخدمت درجة شفافية منخفضة جداً وضئيلة alpha لإظهار وتلخيص أعداد هائلة من النقاط المتراكمة في المخطط الحرج:
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class)) +
geom_smooth(se = FALSE) +
theme(legend.position = "bottom") +
guides(color = guide_legend(nrow = 2, override.aes = list(size = 4)))
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
لاحظ جيداً أن اسم الوسيط والمعلمة الممررة داخل دالة الأدلة guides() يتطابق تماماً وبدقة مع اسم الخاصية الجمالية المستهدفة، تماماً كما رأينا سابقاً في آلية عمل دالة العناوين labs().
11.4.4 استبدال وإحلال المقاييس (Replacing a scale)
بدلاً من الاقتصار على إجراء تحسينات أو تعديلات طفيفة على المعالم الافتراضية، يمكنك تماماً إحلال واستبدال المقياس البياني بالكامل بنظام آخر. وثمة نوعان أساسيان من المقاييس البيانية التي ستجد نفسك راغباً في استبدالها وتغييرها بكثرة في بحوثك وتطبيقاتك: مقاييس المواضع الإحداثية المتصلة (Continuous position scales) ومقاييس الألوان الجمالية (Color scales). ومن حسن الحظ أن القواعد والأسس الهندسية والبرمجية ذاتها تنطبق على كافة الخصائص والمقاييس البيانية الأخرى؛ ولذا، بمجرد أن تتقن وتتمكن من مهارات استبدال مقاييس الموضع والألوان، ستكون قادراً على التعامل مع أي مقاييس أخرى ممتدة بكل سهولة ويسر.
ومن الممارسات والأساليب التحليلية بالغة الفائدة في فهم وتفسير البيانات، القيام بتمثيل التحويلات الرياضية (Mathematical transformations) لمتغيراتك البحثية بصرياً. على سبيل المثال، يصبح من السهل جداً رصد وفهم طبيعة ونقاء العلاقة الرياضية بين متغيري القيراط carat والسعر price إذا قمنا بتحويلهما لوغاريتمياً (Log transform) بالأساس العاشر:
# الأيسر
ggplot(diamonds, aes(x = carat, y = price)) +
geom_bin2d()
#> `stat_bin2d()` using `bins = 30`. Pick better value `binwidth`.
# الأيمن
ggplot(diamonds, aes(x = log10(carat), y = log10(price))) +
geom_bin2d()
#> `stat_bin2d()` using `bins = 30`. Pick better value `binwidth`.

ومع ذلك، فإن عيب هذا التحويل يكمن في أن المحاور يتم تسميتها الآن بالقيم المحوَّلة، مما يجعل تفسير المخطط البياني أمراً صعباً. وبدلاً من إجراء التحويل داخل ربط الخصائص الجمالية (aesthetic mapping)، يمكننا بدلاً من ذلك إجراؤه باستخدام المقياس (scale). هذا الإجراء متطابق بصرياً تماماً، باستثناء أن المحاور يتم تسميتها بناءً على مقياس البيانات الأصلي.
ggplot(diamonds, aes(x = carat, y = price)) +
geom_bin2d() +
scale_x_log10() +
scale_y_log10()
#> `stat_bin2d()` using `bins = 30`. Pick better value `binwidth`.
هناك مقياس آخر يتكرر تخصيصه كثيراً وهو اللون. يختار المقياس الفئوي الافتراضي ألواناً متباعدة بالتساوي حول عجلة الألوان. ومن البدائل المفيدة مقاييس “كولور بروير” (ColorBrewer) التي تم ضبطها يدوياً لتناسب بشكل أفضل الأشخاص الذين يعانون من الأنواع الشائعة من عمى الألوان. يبدو المخططان البيانيان أدناه متشابهين، ولكن هناك اختلاف كافٍ في ظلال اللونين الأحمر والأخضر يتيح تمييز النقاط الموجودة على اليمين حتى من قِبل الأشخاص المصابين بعمى الألوان الفاقد للقدرة على التمييز بين الأحمر والأخضر.1
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = drv))
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = drv)) +
scale_color_brewer(palette = "Set1")

لا تنسَ أيضاً التقنيات الأكثر بساطة لتحسين إمكانية الوصول؛ فإذا كان المخطط البياني يحتوي على عدد قليل من الألوان فقط، يمكنك إضافة ربط إضافي للأشكال (shape mapping) كعنصر تكراري مساعد. سيساعد هذا الإجراء أيضاً في ضمان إمكانية تفسير المخطط البياني وقراءته بوضوح عند طباعته أو عرضه باللونين الأبيض والأسود.
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = drv, shape = drv)) +
scale_color_brewer(palette = "Set1")
وتتوفر توثيقات مقاييس ColorBrewer كاملة عبر الإنترنت، كما تتاح داخل بيئة R عبر حزمة RColorBrewer المتميزة. وتكتسب اللوحات المتتالية المتدرجة (Sequential - في الأعلى) واللوحات المتشعبة المتباعدة (Diverging - في الأسفل) أهمية تطبيقية قصوى إذا كانت المتغيرات الفئوية والنوعية لديك رتبية ومصنفة تصنيفاً تدرجياً، أو تمتلك نقطة مرجعية متمركزة في المنتصف (Middle)؛ وتظهر هذه الحالة بكثرة في البحوث النفسية والتربوية عند استخدام دالة القطع cut() لتحويل المتغير المتصل (مثل درجات الاختبار الخام) إلى متغير فئوي مقيد.
تم توثيق مقاييس “كولور بروير” عبر الإنترنت على الموقع الإلكتروني https://colorbrewer2.org/، وهي متاحة في لغة R عبر حزمة RColorBrewer التي طورها إيريش نويرث (Erich Neuwirth). ويعرض الشكل 11.1 القائمة الكاملة لجميع لوحات الألوان. وتُعد اللوحات المتتالية (في الأعلى) واللوحات المتشعبة (في الأسفل) مفيدة بشكل خاص إذا كانت قيمك الفئوية مرتبة، أو إذا كان لها نقطة “منتصف”. وغالباً ما تبرز الحاجة إلى ذلك إذا كنت قد استخدمت الدالة cut() لتحويل متغير مستمر إلى متغير فئوي.
وعندما تكون لديك مطابقة مسبقة ومحددة نظرياً بين قيم المتغير والألوان (مثل الهويات المؤسسية أو الأحزاب السياسية)، يفضل استخدام دالة المقاييس اليدوية scale_color_manual(). فمثلاً، عند تمثيل الانتماء الحزبي للرؤساء، يقتضي العرف المنهجي استخدام اللون الأحمر للجمهوريين والأزرق للديمقراطيين، ويمكن تعيين هذه الألوان بدقة بالغة عبر أكواد الألوان الست عشرية (Hex color codes):
presidential |>
mutate(id = 33 + row_number()) |>
ggplot(aes(x = start, y = id, color = party)) +
geom_point() +
geom_segment(aes(xend = end, yend = id)) +
scale_color_manual(values = c(Republican = "#E81B23", Democratic = "#00AEF3"))
أما بالنسبة للمتغيرات والألوان المتصلة (Continuous color)، فيمكنك استخدام الدوال المضمنة تلقائياً مثل scale_color_gradient() أو scale_fill_gradient(). وفي حال وجود مقياس متشعب ومتباعد يتمركز حول نقطة وسطية (كالمتوسط الحسابي أو الصفر الافتراضي)، تبرز الدالة scale_color_gradient2() كخيار مثالي يتيح لك، على سبيل المثال، إعطاء القيم الموجبة والسالبة ألواناً متمايزة ومختلفة تماماً، وهو أمر شديد الأهمية لتوضيح المشاهدات التي تقع أعلى أو أقل من المتوسط العام للتوزيع.
وثمة خيار متطور آخر يكمن في الاعتماد على مقاييس ألوان viridis الذكية؛ حيث تم تصميمها بعناية فائقة لتكون مدركة تماماً للأفراد المصابين بكافة أنواع عمى الألوان، بالإضافة إلى ميزتها الجوهرية في الحفاظ على التناسق والانتظام الإدراكي الشديد في حالتي العرض الملون أو الطباعة باللونين الأبيض والأسود. وتتوفر هذه المقاييس في حزمة ggplot2 بثلاث صيغ تناسب طبيعة المتغيرات: متصلة (c)، متقطعة منفصلة (d)، ومقسّمة إلى فئات وصناديق فترية (b).
df <- tibble(
x = rnorm(10000),
y = rnorm(10000)
)
ggplot(df, aes(x, y)) +
geom_hex() +
coord_fixed() +
labs(title = "الافتراضي، متصل", x = NULL, y = NULL)
ggplot(df, aes(x, y)) +
geom_hex() +
coord_fixed() +
scale_fill_viridis_c() +
labs(title = "Viridis، متصل", x = NULL, y = NULL)
ggplot(df, aes(x, y)) +
geom_hex() +
coord_fixed() +
scale_fill_viridis_b() +
labs(title = "Viridis، مقسّم لفئات", x = NULL, y = NULL)


لاحظ أن جميع مقاييس الألوان تأتي في نوعين: scale_color_*() و scale_fill_*() للخصائص الجمالية color و fill على التوالي (تتوفر مقاييس الألوان بكلتا الهجاءين البريطاني والأمريكي).
11.4.5 التكبير والتقريب (Zooming)
هناك ثلاث طرق للتحكم في حدود المخطط البياني (plot limits):
- تعديل البيانات التي يتم رسمها بيانيّاً.
- تعيين الحدود في كل مقياس (scale).
- تعيين الوسيطين
xlimوylimداخل الدالةcoord_cartesian().
سوف نستعرض هذه الخيارات في سلسلة من المخططات البيانية. يوضح المخطط الموجود على اليسار العلاقة بين حجم المحرك وكفاءة استهلاك الوقود، مع تلوين النقاط حسب نوع نظام الدفع. بينما يعرض المخطط الموجود على اليمين المتغيرات نفسها، ولكنه يقتطع جزءاً فرعياً من البيانات التي يتم رسمها بيانيّاً. وقد أثر هذا الاقتطاع الفرعي للبيانات على مقاييس المحورين x و y بالإضافة إلى المنحنى الممهد (smooth curve).
# الأيسر
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = drv)) +
geom_smooth()
# الأيمن
mpg |>
filter(displ >= 5 & displ <= 6 & hwy >= 10 & hwy <= 25) |>
ggplot(aes(x = displ, y = hwy)) +
geom_point(aes(color = drv)) +
geom_smooth()

دعنا نقارن هذه بالمخططين البيانيين أدناه، حيث يحدد المخطط الموجود على اليسار الحدود (limits) على المقاييس الفردية، بينما يحددها المخطط الموجود على اليمين داخل الدالة coord_cartesian(). يمكننا أن نرى أن تقليل الحدود يعادل اقتطاع جزء فرعي من البيانات. وبناءً على ذلك، لتكبير منطقة معينة في المخطط البياني والتقريب منها، يفضل عموماً استخدام الدالة coord_cartesian().
# الأيسر
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = drv)) +
geom_smooth() +
scale_x_continuous(limits = c(5, 6)) +
scale_y_continuous(limits = c(10, 25))
# الأيمن
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = drv)) +
geom_smooth() +
coord_cartesian(xlim = c(5, 6), ylim = c(10, 25))

من ناحية أخرى، فإن تعيين الحدود limits على المقاييس الفردية يكون عموماً أكثر فائدة إذا كنت تريد توسيع الحدود، على سبيل المثال، لمطابقة المقاييس عبر مخططات بيانية مختلفة. فمثلاً، إذا استخرجنا فئتين من السيارات وقمنا برسمهما بيانيّاً بشكل منفصل، فمن الصعب مقارنة المخططات لأن المقاييس الثلاثة (محور x، ومحور y، والخاصية الجمالية للون) لها نطاقات مختلفة.
suv <- mpg |> filter(class == "suv")
compact <- mpg |> filter(class == "compact")
# الأيسر
ggplot(suv, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
labs(title = "سيارات الدفع الرباعي")
# الأيمن
ggplot(compact, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
labs(title = "السيارات الصغيرة")

تتمثل إحدى الطرق للتغلب على هذه المشكلة في مشاركة المقاييس عبر مخططات بيانية متعددة، وتدريب المقاييس (training the scales) باستخدام حدود limits البيانات الكاملة.
x_scale <- scale_x_continuous(limits = range(mpg$displ))
y_scale <- scale_y_continuous(limits = range(mpg$hwy))
col_scale <- scale_color_discrete(limits = unique(mpg$drv))
# الأيسر
ggplot(suv, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
x_scale +
y_scale +
col_scale
# الأيمن
ggplot(compact, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
x_scale +
y_scale +
col_scale

في هذه الحالة المحددة، كان بإمكانك ببساطة استخدام تقسيم الأوجه (faceting)، ولكن هذه التقنية مفيدة بشكل أعم، إذا كنت تريد -على سبيل المثال- توزيع المخططات البيانية على صفحات متعددة من التقرير.
11.4.6 تمارين
- لماذا لا يقوم الكود التالي بتجاوز المقياس الافتراضي (default scale)؟
df <- tibble(
x = rnorm(10000),
y = rnorm(10000)
)
ggplot(df, aes(x, y)) +
geom_hex() +
scale_color_gradient(low = "white", high = "red") +
coord_fixed()ما هو الوسيط الأول (first argument) لكل مقياس (scale)؟ وكيف يقارن بالدالة
labs()؟-
غيّر طريقة عرض الفترات الرئاسية من خلال:
أ. الدمج بين النوعين اللذين يخصصان الألوان وفواصل محور x (x axis breaks).
ب. تحسين طريقة عرض محور y.
ج. تسمية كل فترة باسم الرئيس الخاص بها.
د. إضافة تسميات توضيحية ومعلوماتية للمخطط البياني (plot labels).
هـ. وضع فواصل (breaks) كل 4 سنوات (هذا الأمر أكثر صعوبة مما يبدو!). أولاً، أنشئ المخطط البياني التالي. ثم قم بتعديل الكود باستخدام
override.aesلجعل مفتاح الشكل (legend) أسهل في القراءة والرؤية.
ggplot(diamonds, aes(x = carat, y = price)) +
geom_point(aes(color = cut), alpha = 1/20)11.5 السمات (Themes)
أخيراً، يمكنك تخصيص العناصر غير المتعلقة بالبيانات (non-data elements) في مخططك البياني باستخدام السمات (theme):
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class)) +
geom_smooth(se = FALSE) +
theme_bw()
تتضمن حزمة ggplot2 السمات المظهرية الثمانية الموضحة في الشكل 11.2، مع اعتماد الدالة theme_gray() كسمة افتراضية.2 كما تم تضمين العديد من السمات الإضافية في الحزم الملحقة مثل ggthemes (https://jrnold.github.io/ggthemes) التي طورها جيفري أرنولد (Jeffrey Arnold). ويمكنك أيضاً إنشاء سماتك المظهرية الخاصة إذا كنت تحاول مطابقة أسلوب تنسيق معين خاص بشركة أو بمجلة علمية.
من الممكن أيضاً التحكم في المكونات الفردية لكل سمة مظهرية، مثل حجم ولون الخط المستخدم لمحور y. لقد رأينا بالفعل أن الوسيط legend.position يتحكم في مكان رسم مفتاح الشكل (legend). وهناك العديد من الجوانب الأخرى لمفتاح الشكل التي يمكن تخصيفتها باستخدام الدالة theme(). على سبيل المثال، في المخطط البياني أدناه، نقوم بتغيير اتجاه مفتاح الشكل بالإضافة إلى وضع إطار أسود حوله. لاحظ أن تخصيص عناصر مربع مفتاح الشكل وعناصر عنوان المخطط البياني في السمة المظهرية يتم باستخدام دالات element_*(). وتحدد هذه الدالات نمط المكونات غير المتعلقة بالبيانات، فعلى سبيل المثال، يتم جعل نص العنوان عريضاً (bolded) في وسيط المظهر face الخاص بالدالة element_text()، ويتم تحديد لون إطار مفتاح الشكل في وسيط اللون color الخاص بالدالة element_rect(). أما عناصر السمة المظهرية التي تتحكم في موضع العنوان والتعليق التوضيحي فهي plot.title.position و plot.caption.position على التوالي. وفي المخطط البياني التالي، تم تعيين هذه العناصر على القيمة "plot" للإشارة إلى أن هذه العناصر يتم محاذاتها مع مساحة المخطط البياني بأكملها، بدلاً من لوحة المخطط البياني (plot panel) وهو الخيار الافتراضي. كما تُستخدم بعض مكونات theme() المفيدة الأخرى لتغيير موضع أو تنسيق نص العنوان والتعليق التوضيحي.
ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
labs(
title = "تميل محركات السيارات ذات الأحجام الأكبر إلى استهلاك أعلى للوقود",
caption = ":https://fueleconomy.gov. المصدر المرجعي للبيانات"
) +
theme(
legend.position = c(0.6, 0.7),
legend.direction = "horizontal",
legend.box.background = element_rect(color = "black"),
plot.title = element_text(face = "bold"),
plot.title.position = "plot",
plot.caption.position = "plot",
plot.caption = element_text(hjust = 0)
)
للحصول على نظرة عامة على جميع مكونات الدالة theme()، راجع صفحة المساعدة عبر الأمر ?theme. كما يُعد كتاب ggplot2 book مكاناً رائعاً أيضاً للاطلاع على التفاصيل الكاملة المتعلقة بالسمات المظهرية.
11.5.1 تمارين
- اختر سمة مظهرية توفرها حزمة
ggthemesوقم بتطبيقها على آخر مخطط بياني أنشأته. - اجعل تسميات المحاور (axis labels) لمخططك البياني باللون الأزرق وخط عريض (bolded).
11.6 تخطيط الواجهة (Layout)
ركزنا في حديثنا وشرحنا السابق على كيفية بناء وتطوير وتحسين لوحة رسم بيانية مفردة ومستقلة. ولكن ماذا لو كانت لديك مخططات ورسوم إحصائية متعددة ومختلفة وتريد دمجها وتوزيعها هندسياً بطريقة مخصصة ومحكمة داخل لافحة بيانية فائقة واحدة؟ تتيح لك حزمة patchwork الرائدة دمج وتجميع الرسوم المنفصلة وتنسيقها داخل ذات الرسم البياني بكفاءة متناهية.
ولوضع مخططين بيانيين متجاورين جنباً إلى جنب، يمكنك ببساطة استخدام عامل الإضافة الرياضي المباشر + بينهما؛ ولاحظ هنا أنه يتعين عليك أولاً إنشاء الرسوم البيانية الفردية وحفظها ككائنات ومخرجات مستقلة داخل ذاكرة النظام النشطة (حيث أطلقنا عليها في المثال التالي التسميات الكائنية p1 و p2)، ومن ثم تجميعهما أفقياً ومباشرة عبر الرمز الجبري المألوف:
p1 <- ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
labs(title = "المخطط الأول")
p2 <- ggplot(mpg, aes(x = drv, y = hwy)) +
geom_boxplot() +
labs(title = "المخطط الثاني")
p1 + p2
ومن المهم جداً الانتباه علمياً وبرمجياً إلى أننا في الكود السابق لم نقم باستدعاء دالة جديدة من حزمة patchwork بالمعنى التقليدي، بل إن الحزمة قامت بشكل ذكي وفائق بإعادة تكييف وتوسيع الخصائص الوظيفية لعامل الجمع الرياضي المألوف + ليفهم كتل رسوم ggplot2 ويقوم بتجميعها هندسياً.
ويمكنك أيضاً بناء وتصميم هياكل وتوزيعات بالغة التعقيد والعمق للوحات الرسومية المتعددة باستخدام أدوات التوجيه الرياضية في حزمة patchwork ؛ حيث يقوم عامل الخط العمودي | بوضع المخططين p1 و p3 متجاورين متراصين أفقياً في ذات السطر البصري، بينما يتولى عامل القسمة والشرطة المائلة / نفل المخطط اللاحق p2 إلى السطر والسطح السفلي التالي مباشرة لتنظيم وتنسيق المساحة البنائية الفائقة:
p3 <- ggplot(mpg, aes(x = cty, y = hwy)) +
geom_point() +
labs(title = "المخطط الثالث")
(p1 | p3) / p2
وبالإضافة إلى ما سبق، تمنحك حزمة patchwork قدرات متميزة لجمع وتوحيد مفاتيح ومربعات الرسم التوضيحية (Legends) المتناثرة من مخططات متعددة ودمجها بالكامل داخل مربع توضيحي مركزي وموحد ومشترك، مع إمكانية التخصيص المطلق لأبعاد ومساحات كل رسم، وإضافة عناوين رئيسية وفرعية وهوامش تعليقية عليا موحدة وشاملة للوحة الفائقة ككل. ننشئ في الكود المتقدم أدناه 5 مخططات ورسوم إحصائية متنوعة؛ وقمنا بإخفاء الأدلة والمفاتيح الفردية من المخططات الصندوقية ومخطط التشتت لمنع التكرار والحشو البصري، وجمعنا المفاتيح والأدلة الخاصة بمخططات الكثافة الاحتمالية وترحيلها لأعلى اللوحة الكلية دفعة واحدة عبر الصياغة الرابطة الرائعة & theme(legend.position = "top"). ولاحظ هنا بدقة استخدامنا لعامل الربط الفائق & بدلاً من عامل الجمع الاعتيادي +؛ وذلك لأننا هنا نقوم بتعديل وتحديث السمة المظهرية الكلية لكتلة وتجميعة المخططات المدمجة بالكامل ككيان واحد موحد، وليس تعديل رسم بياني فردي منفصل. وتم حجز وتخصيص موضع مستقل للمربع التوضيحي الموحد في القمة داخل منطقة الدليل المخصصة guide_area(). وأخيراً، قمنا بهندسة وضبط الارتفاعات النسبية الدقيقة لكافة المكونات الهيكلية المتداخلة للمخطط التجميعي: فأعطينا منطقة الدليل العلوي وزناً نسبياً يبلغ 1، تليها المخططات الصندوقية بوزن 3، ثم مخططات الكثافة بوزن 2، وأخيراً مخطط التشتت المقسم لمتغير الدفع بوزن نسبي يبلغ 4. وتقوم الحزمة بتقسيم وتوزيع المساحة الكلية المتاحة للافحة الرسم بناءً على هذه النسب الرياضية التوزيعية بامتياز وتضع المكونات في مواضعها بدقة متناهية:
p1 <- ggplot(mpg, aes(x = drv, y = cty, color = drv)) +
geom_boxplot(show.legend = FALSE) +
labs(title = "المخطط الأول")
p2 <- ggplot(mpg, aes(x = drv, y = hwy, color = drv)) +
geom_boxplot(show.legend = FALSE) +
labs(title = "المخطط الثاني")
p3 <- ggplot(mpg, aes(x = cty, color = drv, fill = drv)) +
geom_density(alpha = 0.5) +
labs(title = "المخطط الثالث")
p4 <- ggplot(mpg, aes(x = hwy, color = drv, fill = drv)) +
geom_density(alpha = 0.5) +
labs(title = "المخطط الرابع")
p5 <- ggplot(mpg, aes(x = cty, y = hwy, color = drv)) +
geom_point(show.legend = FALSE) +
facet_wrap(~drv) +
labs(title = "المخطط الخامس")
(guide_area() / (p1 + p2) / (p3 + p4) / p5) +
plot_annotation(
title = "كفاءة استهلاك الوقود داخل المدينة وعلى الطرق السريعة للسيارات بمختلف أنظمة الدفع",
caption = ":https://fueleconomy.gov. المصدر المرجعي للبيانات"
) +
plot_layout(
guides = "collect",
heights = c(1, 3, 2, 4)
) &
theme(legend.position = "top")
إذا كنت ترغب في معرفة المزيد حول دمج وتخطيط مخططات بيانية متعددة باستخدام حزمة patchwork، فإننا نوصي بالاطلاع على الأدلة الإرشادية المتاحة على الموقع الإلكتروني للحزمة: https://patchwork.data-imaginist.com.
11.6.1 تمارين
- ماذا يحدث إذا حذفت الأقواس في تخطيط المخطط البياني (plot layout) التالي؟ هل يمكنك تفسير سبب حدوث ذلك؟
p1 <- ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
labs(title = "المخطط الأول")
p2 <- ggplot(mpg, aes(x = drv, y = hwy)) +
geom_boxplot() +
labs(title = "المخطط الثاني")
p3 <- ggplot(mpg, aes(x = cty, y = hwy)) +
geom_point() +
labs(title = "المخطط الثالث")
(p1 | p2) / p3- باستخدام المخططات البيانية الثلاثة من التمرين السابق، أعِد إنشاء التجميعة الرمزية (patchwork) التالية.

11.7 ملخص
في هذا الفصل، تعلمت كيفية إضافة التسميات التوضيحية للمخطط البياني (plot labels) مثل العنوان الرئيسي (title)، والعنوان الفرعي (subtitle)، والتعليق السفلي (caption)، بالإضافة إلى تعديل تسميات المحاور الافتراضية، واستخدام التعليقات التفسيرية (annotation) لإضافة نصوص معلوماتية إلى مخططك البياني أو لإبراز نقاط بيانات محددة، وتخصيص مقاييس المحاور (axis scales)، وتغيير السمة المظهرية (theme) للمخطط البياني. كما تعلمت أيضاً كيفية دمج مخططات بيانية متعددة في رسم جرافيكي واحد باستخدام تخطيطات بسيطة ومعقدة للمخططات البيانية (plot layouts).
على الرغم من أنك تعلمت حتى الآن كيفية إنشاء العديد من الأنواع المختلفة للمخططات البيانية وكيفية تخصيصها باستخدام مجموعة متنوعة من التقنيات، إلا أننا لم نكشف إلا عن جزء بسيط جداً مما يمكنك إنشاؤه باستخدام حزمة ggplot2. وإذا كنت ترغب في اكتساب فهم شامل وعميق لمنظومة ggplot2، فإننا نوصي بشدة بقراءة كتاب ggplot2: Elegant Graphics for Data Analysis. كما تشمل المصادر المرجعية النافعة الأخرى كتاب R Graphics Cookbook للمؤلف وينستون تشانغ (Winston Chang)، وكتاب Fundamentals of Data Visualization للمؤلف كلاوس ويلكي (Claus Wilke).
يمكنك استخدام أداة مثل SimDaltonism لمحاكاة عمى الألوان واختبار هذه الصور.↩︎
يتساءل الكثير من الناس عن سبب امتلاك السمة الافتراضية لخلفية رمادية. لقد كان هذا خياراً متعمداً لأنه يبرز البيانات ويقدمها للأمام مع الحفاظ على وضوح خطوط الشبكة. إن خطوط الشبكة البيضاء تكون مرئية (وهو أمر مهم لأنها تساعد بشكل كبير في تقدير وتحديد المواضع)، ولكن تأثيرها البصري ضئيل ويمكننا تجاهلها بسهولة. وتمنح الخلفية الرمادية المخطط البياني لوناً طباعياً مشابهاً للنص، مما يضمن انسجام الرسومات الجرافيكية مع تدفق المستند دون أن تبرز بشكل فج بسبب وجود خلفية بيضاء ساطعة. وأخيراً، تخلق الخلفية الرمادية مجالاً مستمراً من الألوان يضمن إدراك المخطط البياني ككيان بصري واحد.↩︎