رسم بياني مبعثر في لغة R باستخدام ggplot2 مع مثال
⚡ ملخص ذكي
يرسم مخطط التشتت في لغة R باستخدام ggplot2 متغيرين متصلين على المحورين السيني والصادي باستخدام الدالة geom_point(). يغطي هذا الشرح كيفية رسم مخطط التشتت.ping حسب اللون، والتحويلات اللوغاريتمية، وخطوط الانحدار الملائمة، والتسميات، والتقسيم، وتصحيحات التراكب، والمقاييس، والسمات، والحفظ.

لماذا تُعدّ الرسوم البيانية مهمة في تحليل البيانات؟
الرسوم البيانية هي الجزء الثالث من عملية تحليل البيانات. الجزء الأول عباره عن بيانات مثالtracالإنتاج، ويتناول الجزء الثاني تنظيف ومعالجة البيانات. أخيرًا، قد يحتاج عالم البيانات إلى ذلك توصيل نتائجه بيانيا.
يلخص الشكل أدناه سير عمل عالم البيانات.
- المهمة الأولى لعالم البيانات هي تحديد سؤال البحث. يعتمد هذا السؤال البحثي على أهداف وغايات المشروع.
- بعد ذلك، من أبرز المهام هي هندسة الميزات. يحتاج عالم البيانات إلى جمع البيانات ومعالجتها وتنظيفها
- عند اكتمال هذه الخطوة، يمكنه البدء في استكشاف مجموعة البيانات. في بعض الأحيان، يكون من الضروري تحسين وتغيير الفرضية الأصلية بسبب اكتشاف جديد.
- عندما تفسيري بعد تحقيق التحليل، يجب على عالم البيانات أن يأخذ في الاعتبار قدرة القارئ على ذلك فهم المفاهيم والنماذج الأساسية.
- وينبغي تقديم نتائجه في شكل يمكن لجميع أصحاب المصلحة فهمه. واحدة من أفضل الطرق ل التواصل النتائج من خلال أ رسم بياني.
- تُعد الرسوم البيانية أداة رائعة لتبسيط التحليلات المعقدة.
بقية هذا البرنامج التعليمي تقوم بإنشاء تلك الرسوم البيانية باستخدام حزمة ggplot2.
حزمة ggplot2
يركز هذا البرنامج التعليمي على إنشاء الرسوم البيانية في لغة R باستخدام ggplot2.
في هذا الدرس، ستستخدم حزمة ggplot2. تُطبّق هذه الحزمة قواعد الرسم البياني التي وصفها ليلاند ويلكنسون عام 2005. تتميز ggplot2 بمرونتها، وتأتي مع العديد من القوالب، وتتيح لك تحديد رسم بياني بمستوى عالٍ من الدقة.tracملاحظة: لا ينتج هذا البرنامج رسومات ثلاثية الأبعاد أو تفاعلية؛ فهذه تتطلب حزمًا مثل plotly أو rgl.
في ggplot2، يتكون الرسم البياني من الوسائط التالية:
- البيانات
- خريطة جماليةping
- كائن هندسي
- التحولات الإحصائية
- النطاقات
- نظام الإحداثيات
- تعديلات الموقف
- الوجه
سوف تتعلم كيفية التحكم في تلك الوسائط في البرنامج التعليمي.
بناء الجملة الأساسي لـ ggplot2 هو:
ggplot(data, mapping=aes()) + geometric object arguments: data: Dataset used to plot the graph mapping: Control the x and y-axis geometric object: The type of plot you want to show. The most common object are: - Point: `geom_point()` - Bar: `geom_bar()` - Line: `geom_line()` - Histogram: `geom_histogram()`
كيفية إنشاء مخطط التشتت في لغة البرمجة R
دعونا نرى كيف يعمل ggplot مع مجموعة بيانات mtcars. عليك أن تبدأ برسم مخطط مبعثر لمتغير mpg ومتغير drat.
مؤامرة مبعثر الأساسية
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
Code تفسير
- عليك أولاً تمرير مجموعة البيانات mtcars إلى ggplot.
- داخل الوسيطة aes()، يمكنك إضافة المحور السيني والمحور الصادي.
- تعني علامة + أنك تريد من R الاستمرار في قراءة الكود. وهذا يجعل الكود أكثر قابلية للقراءة عن طريق كسره.
- استخدم Geom_point() للكائن الهندسي.
الإخراج:
مؤامرة مبعثرة مع المجموعات
في بعض الأحيان، قد يكون من المثير للاهتمام التمييز بين القيم من خلال مجموعة من البيانات (أي بيانات مستوى العامل).
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
Code تفسير
- تتحكم الدالة aes() الموجودة داخل الدالة geom_point() في لون كل مجموعة.ping يجب أن يكون المتغير عاملاً، لذلك يتم تغليف الترس في عامل().
- وإجمالاً، لديك الكود aes(color = Factor(gear)) الذي يغير لون النقاط.
الإخراج:
قم بتغيير مقياس المحور باستخدام التحويل اللوغاريتمي
تُعدّ إعادة تحجيم البيانات جزءًا أساسيًا من عمل المحلل، لأنّ المتغيرات الخام نادرًا ما تأتي على شكل منحنى طبيعي. ويُعدّ استخدام اللوغاريتمات إحدى طرق ضغط القيم المتطرفة وجعل الرسم البياني أقل حساسية للقيم الشاذة.
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
Code تفسير
- تقوم بتحويل المتغيرين x و y في دالة log() مباشرةً داخل دالة aes() mapping.
لاحظ أنه يمكن تطبيق أي تحويل آخر مثل التوحيد القياسي أو التطبيع.
الإخراج:
مؤامرة مبعثرة مع القيم المجهزة
يمكنك إضافة مستوى آخر من المعلومات إلى الرسم البياني. يمكنك إضافة القيم المُقاسة لـ الانحدارالخطي.
my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear))) + stat_smooth(method = "lm", col = "#C42126", se = FALSE, size = 1) my_graph
Code تفسير
- my_graph: يتم تخزين الرسم البياني في الكائن my_graph، لذا يمكن إضافة طبقات في الخطوات اللاحقة دون تكرار الاستدعاء بالكامل.
- تتحكم الوسيطة stat_smooth() في طريقة التجانس
- الطريقة = "lm": الانحدار الخطي
- col = “#C42126”: Code للون الأحمر للخط
- se = FALSE: لا تعرض الخطأ القياسي
- size = 1: سُمك الخط. في ggplot2 الإصدار 3.4.0 والإصدارات اللاحقة، أُعيد تسمية هذه الوسيطة إلى linewidth لأشكال الخطوط الهندسية.
الإخراج:
لاحظ أن طرق التجانس الأخرى متوفرة
- GLM
- حركة اتشيه الحرة
- loess: الخيار الافتراضي لأقل من 1,000 مشاهدة
- rlm: نموذج خطي قوي، من حزمة MASS
قبل تصميم الرسم البياني، يجدر معرفة متى يكون الرسم البياني المبعثر هو الخيار الصحيح على الإطلاق.
مخطط التشتت مقابل مخطط الخط مقابل Bubblالرسم البياني في لغة R
جميعها ترسم متغيرين متصلين مقابل بعضهما البعض، لذا فإن الاختيار يعتمد على ما يجب أن يستنتجه القارئ.
| المعايير | مخطط مبعثر | خط الرسم البياني | Bubblمخطط البريد |
|---|---|---|---|
| يظهر | الارتباط بين متغيرين | تغيير متغير واحد على محور مرتب | الارتباط بالإضافة إلى مقدار ثالث |
| المحور السيني | أي متغير مستمر | عادةً ما يكون الوقت أو مقياسًا ترتيبيًا آخر | أي متغير مستمر |
| ترتيب النقاط | ليست له صلة، لا علاقة له مع الموضوع | النقاط الحرجة متصلة | ليست له صلة، لا علاقة له مع الموضوع |
| المتغير الثالث | من خلال اللون أو الشكل | عبر خطوط منفصلة | حجم النقطة |
| استدعاء ggplot2 | geom_point() | geom_line() | geom_point(aes(size = z)) |
يُعدّ توصيل النقاط المبعثرة بخط عندما لا يكون للمحور السيني ترتيب طبيعي خطأً شائعًا، إذ يوحي بوجود تسلسل غير موجود. لذا، يُنصح باستخدام دالة geom_line() مع المحاور المرتبة، مثل التواريخ. أما بالنسبة لتوزيعات متغير واحد، فاستخدم... مربع مؤامرة بدلا من ذلك.
إضافة معلومات إلى الرسم البياني
حتى الآن، لا تحتوي الرسوم البيانية على أي نص توضيحي. ينبغي أن يتمكن القارئ من فهم المعلومات الواردة في البيانات من الرسم البياني وحده، دون الحاجة إلى الرجوع إلى وثائق إضافية، مما يعني أن الرسم البياني يحتاج إلى تسميات واضحة. يمكنك إضافة التسميات باستخدام الدالة labs().
الصيغة الأساسية للدالة labs() هي:
labs(title = "Hello Guru99") arguments: - title: Main title displayed above the plot - subtitle: Secondary line below the title - caption: Note below the plot, usually the data source - x: Rename the x-axis - y: Rename the y-axis - color / fill: Rename the legend Example: labs(title = "Hello Guru99", subtitle = "My first plot")
إضافة عنوان
من الواضح أن إحدى المعلومات الإلزامية التي يجب إضافتها هي العنوان.
my_graph +
labs(
title = "Plot Mile per hours and drat, in log"
)
Code تفسير
- my_graph: يمكنك استخدام الرسم البياني الذي قمت بتخزينه. إنه يتجنب إعادة كتابة جميع الرموز في كل مرة تقوم فيها بإضافة معلومات جديدة إلى الرسم البياني.
- تقوم بتضمين العنوان داخل labs().
الإخراج:
أضف عنوانًا باسم ديناميكي
يعد العنوان الديناميكي مفيدًا لإضافة معلومات أكثر دقة في العنوان.
يمكنك استخدام وظيفة اللصق () لطباعة نص ثابت ونص ديناميكي. بناء الجملة الأساسي لـ Paste () هو:
paste("This is a text", A) arguments - " ": Text inside the quotation marks are the static text - A: Display the variable stored in A - Note you can add as much static text and variable as you want. You need to separate them with a comma
على سبيل المثال:
A <- 2010
paste("The first year is", A)
الإخراج:
## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)
الإخراج:
## [1] "The first year is 2010 and the last year is 2018"
يمكنك إضافة اسم ديناميكي إلى الرسم البياني الخاص بنا، وهو متوسط ميلا في الغالون.
mean_mpg <- mean(mtcars$mpg) my_graph + labs( title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg) )
Code تفسير
- يمكنك إنشاء متوسط ميلا في الغالون مع متوسط (mtcars$mpg) المخزن في متغير Mean_mpg
- يمكنك استخدام اللصق () مع mean_mpg لإنشاء عنوان ديناميكي يُرجع القيمة المتوسطة لـ mpg
الإخراج:
أضف عنوانًا فرعيًا
هناك تفصيلان إضافيان يُوضّحان الرسم البياني بشكلٍ أكبر. أنت تتحدث عن العنوان الفرعي والتعليق. يوضع العنوان الفرعي أسفل العنوان الرئيسي مباشرةً. أما التعليق، فيمكنه أن يُشير إلى مُجري الحسابات ومصدر البيانات.
my_graph +
labs(
title =
"Relation between Mile per hours and drat",
subtitle =
"Relationship break down by gear class",
caption = "Authors own computation"
)
Code تفسير
- أضفتَ داخل دالة labs() ما يلي:
- العنوان = "العلاقة بين ميل في الساعة ودرات": أضف عنوانًا
- العنوان الفرعي = "تقسيم العلاقة حسب فئة الترس": أضف عنوانًا فرعيًا
- تسمية توضيحية = "الحسابات الخاصة بالمؤلفين: أضف تسمية توضيحية
- يمكنك فصل كل معلومات جديدة بفاصلة، ،
- لاحظ أنك قمت بكسر سطور التعليمات البرمجية. إنه ليس إلزاميًا، ويساعد فقط على قراءة الكود بسهولة أكبر
الإخراج:
إعادة تسمية المحور السيني والمحور الصادي
نادراً ما تكون أسماء الأعمدة جاهزة للعرض. غالباً ما تكون مختصرة أو تستخدم شرطات سفلية بين الكلمات، كما في GDP_CAP. أعد تسميتها في الرسم البياني وأضف الوحدات حيثما كان ذلك مهماً.
my_graph +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code تفسير
- أضفتَ داخل دالة labs() ما يلي:
- x = "تعريف Drat": تغيير اسم المحور السيني
- y = “ميل في الساعة”: تغيير اسم المحور y
الإخراج:
السيطرة على المقاييس
يمكنك التحكم في حجم المحور.
تعتبر الدالة seq() ملائمة عندما تحتاج إلى إنشاء تسلسل رقمي. بناء الجملة الأساسي هو:
seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`
على سبيل المثال، نطاق من 0 إلى 12 بخطوة مقدارها 4 يعيد أربعة أرقام: 0 و4 و8 و12.
seq(0, 12,4)
الإخراج:
## [1] 0 4 8 12
يمكنك التحكم في مقياس المحور السيني والمحور الصادي كما هو موضح أدناه
my_graph +
scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code تفسير
- تتحكم الدالةscale_y_continious() في المحور الصادي
- تتحكم الدالةscale_x_continious() في المحور السيني.
- تتحكم فواصل المعلمة في تقسيم المحور. يمكنك إضافة تسلسل الأرقام يدويًا أو استخدام الدالة seq():
- seq(1, 3.6, by = 0.2): أنشئ التسلسل من 1 إلى 3.6 بخطوات مقدارها 0.2، أي 14 نقطة توقف
- seq(1, 1.6, by = 0.1): أنشئ سبعة أعداد من 1 إلى 1.6 بزيادات قدرها 0.1
الإخراج:
موضوع
وأخيرًا، تتيح لك مكتبة ggplot2 إعادة تصميم الرسم البياني بالكامل باستخدام دالة واحدة لتغيير المظهر. تتضمن الحزمة ثمانية مظاهر كاملة:
- theme_bw()
- theme_light()
- theme_classic()
- theme_linedraw()
- theme_dark()
- theme_minimal()
- theme_gray()
- theme_void()
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
الإخراج:
حفظ المؤامرات
بعد إتمام هذه الخطوات، حان وقت حفظ الرسم البياني ومشاركته. استدعِ الدالة ggsave(“name_of_the_file.png”) مباشرةً بعد رسم الرسم البياني، وسيتم حفظ الصورة على القرص.
يتم حفظ الرسم البياني في دليل العمل. للتحقق من دليل العمل، يمكنك تشغيل هذا الكود:
directory <- getwd() directory
ارسم الرسم البياني النهائي، واحفظه، وتحقق من موقعه النهائي:
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
الإخراج:
ggsave("my_fantastic_plot.png")
الإخراج:
## Saving 5 x 4 in image
ملاحظات: للأغراض التعليمية فقط، أنشأنا وظيفة تسمى open_folder() لفتح مجلد الدليل لك. كل ما عليك فعله هو تشغيل الكود أدناه ومعرفة مكان تخزين الصورة. يجب أن تشاهد أسماء الملفات my_fantastic_plot.png.
# Run this code to create the function open_folder <- function(dir) { if (.Platform['OS.type'] == "windows") { shell.exec(dir) } else { system(paste(Sys.getenv("R_BROWSER"), dir)) } } # Call the function to open the folder open_folder(directory)
كيفية إنشاء مخططات التشتت متعددة الأوجه في لغة R باستخدام دالة facet_wrap()
يُعدّ تقسيم البيانات إلى أجزاء أحد مكونات ggplot2 الثمانية المذكورة سابقًا، وهو الحل الأمثل للرسوم البيانية المزدحمة. فبدلًا من دمج جميع المجموعات في لوحة واحدة، يرسم ggplot2 عدة أجزاء صغيرة لكل مستوى من مستويات المتغير، جميعها على نفس المقياس، مما يضمن سهولة مقارنة اللوحات.
# One panel per gear count ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() + facet_wrap(~ gear) + theme_classic()
ثلاثة حجج تقوم بمعظم العمل.
- ncol or الآن: فرض اللوحات في تخطيط معين، على سبيل المثال facet_wrap(~ gear, ncol = 2).
- النطاقاتيتم ضبط "ثابت" افتراضيًا بحيث تشترك جميع اللوحات في نطاق محور واحد. استخدم "free_y" أو "free" عندما تختلف المجموعات اختلافًا كبيرًا في الحجم، ولكن انتبه إلى أن المقاييس الحرة تجعل المقارنة البصرية بين اللوحات مضللة.
- وصفها: يستبدل مستوى العامل الخام في كل شريط، على سبيل المثال labeller = label_both لطباعة "gear: 4" بدلاً من "4".
مجموعتانping المتغيرات. استخدم الدالة facet_grid() لإنشاء مصفوفة من اللوحات، مع وجود المتغير الأول عبر الصفوف والثاني عبر الأعمدة:
ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point(aes(color = factor(cyl))) + facet_grid(am ~ gear) + theme_classic()
أوجه أم ألوان؟ يُعدّ التلوين خيارًا مناسبًا حتى أربع مجموعات تقريبًا على الرسم البياني مع تداخل محدود. بعد ذلك، أو عندما تتداخل المجموعات بشكل كبير، يصبح تقسيم الرسم البياني إلى أجزاء أسهل في القراءة لأن كل جزء يحمل نقاطه الخاصة فقط. يمكنك الجمع بين الطريقتين: تقسيم الرسم البياني إلى أجزاء باستخدام متغير واحد وتلوينه باستخدام متغير آخر، كما في مثال facet_grid() أعلاه.
كيفية التعامل مع تداخل الرسومات في مخططات التشتت في لغة R
مع بضع عشرات من الملاحظات، تصبح كل نقطة مرئية. أما مع آلاف الملاحظات، فتتراكم العلامات فوق بعضها البعض، وتظهر المنطقة الأكثر كثافة ككتلة صلبة. هذا هو المبالغةويقدم ggplot2 أربعة حلول قياسية.
1. تقليل الشفافية. الحل الأرخص. تداخلping تصبح النقاط داكنة بشكل طبيعي، فتصبح الكثافة مرئية:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + theme_classic()
2. قيم التذبذب المنفصلة. عندما يأخذ متغير ما عددًا محدودًا من القيم، تقع النقاط على نفس الإحداثيات. ويفصل بينها إزاحة عشوائية صغيرة.
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + geom_jitter(width = 0.15, height = 0) + theme_classic()
قم بتعيين الارتفاع = 0 بحيث لا يتم تغيير قيم y، التي تحمل المعلومات الحقيقية، أبدًا.
3. قم بإخراج الطائرة من الصندوق. بالنسبة لمجموعات البيانات الكبيرة، يتم حساب عدد المشاهدات في كل خلية وربط هذا العدد باللون. تتجنب المربعات السداسية التشوهات البصرية التي تنتجها المربعات.
ggplot(diamonds, aes(x = carat, y = price)) + geom_hex(bins = 40) + theme_classic()
4. ارسم خطوط الكثافة. تحدد خطوط الكنتور المناطق التي تتركز فيها الملاحظات، وتتداخل بدقة فوق النقاط الباهتة:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + geom_density_2d(color = "#C42126") + theme_classic()
كقاعدة عامة، يتعامل ألفا مع بضعة آلاف من النقاط، ويتعامل التجميع السداسي مع عشرات الآلاف، وأخذ عينات من البيانات باستخدام dplyr::slice_sample() هو الخيار العملي لما بعد ذلك.
مخطط التشتت في لغة البرمجة R: Code الرقم المرجعي
يسرد الجدول أدناه استدعاء ggplot2 لكل خيار تم تناوله أعلاه:
| الهدف | Code |
|---|---|
| مؤامرة مبعثر الأساسية |
ggplot(df, aes(x = x1, y = y)) + geom_point() |
| مخطط التشتت مع مجموعة الألوان |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2))) |
| إضافة القيم المجهزة |
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm") |
| أضف العنوان |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99")) |
| إضافة العنوان الفرعي |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99")) |
| إعادة تسمية س |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1") |
| إعادة تسمية ذ |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1") |
| التحكم في المقياس |
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1)) |
| إنشاء سجلات |
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point() |
| موضوع |
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic() |
| وجه من قبل مجموعة |
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2) |
| معالجة التداخل في الرسم البياني |
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3) |
| التوفير |
ggsave("my_fantastic_plot.png")
|












