نمودار نقطه ای (Scatter Plot) در R — راهنمای کاربردی
یکی از بخشهای مهم در «تحلیل دادهها» (Data Analysis)، «بصری سازی دادهها» (Data Visualization) است. رسم نمودارها یکی از روشهای معمول در بصریسازی یا نمایش دادهها است. در این نوشتار با شیوه ترسیم «نمودارهای نقطهای» (Scatter Plot) با استفاده از کتابخانه ggplot2 در زبان برنامه نویسی R میپردازیم.
نمودار نقطهای، برای نمایش مقدارهای عددی و متغیرهای کمی به کار میرود. به این ترتیب میتوان رابطه بین متغیرهای کمی را درک و نمایش داد. کتابخانه ggplot2 شامل توابع متنوعی برای ترسیم این گونه نمودارها است. در این نوشتار سعی میکنیم با ذکر مثالهایی، با دستورات و شیوه ترسیم نمودار نقطهای آشنا شویم.
نوشتار نمایش و رسم نمودار برای دادهها — معرفی و کاربردها به معرفی انواع نمودارها پرداخته است. به عنوان مقدمه، پیشنهاد میشود که این متن را مطالعه کنید. از آنجایی که برای مقایسه متغیرهای کمی در سطوح مختلف متغیر کیفی یا فاکتور از نمودار نقطهای نیز میتوان استفاده کرد، خواندن متغیر فاکتور (Factor) یا متغیر عامل در R — راهنمای کاربردی خالی از لطف نیست.
نمودار نقطهای (Scatter Plot)
در این نوشتار براساس کتابخانه ggplot2 و توابع آن به رسم نمودار نقطهای در حالتهای مختلف میپردازیم.
ویژگی مهمی که کتابخانه ggplot2 برای رسم نمودارهای مختلف وجود دارد استفاده از عناصر مختلف در ترسیم آنها است.
در ادامه به بعضی از این عناصر خواهیم پرداخت.
- دادهها (Data)
- نقشههای زیبا (Aesthetic Mapping)
- اشکال هندسی (Geometric Object)
- تبدیلات آماری (Statistical Transformation)
- مقیاسها (Scales)
- سیستم مختصات (Coordinate System)
- تنظیم موقعیت اجزای نمودار (Position Adjustments)
- ...
تابع ggplot در کتابخانه ggplot2 به رسم نمودارها اختصاص دارد. شکل پایه برای تابع ggplot به صورت زیر است.
1ggplot(data, mapping=aes()) +
2geometric object
3
4arguments:
5data: Dataset used to plot the graph
6mapping: Control the x and y-axis
7geometric object: The type of plot you want to show. The most common object are:
8
9- Point: `geom_point()`
10- Bar: `geom_bar()`
11- Line: `geom_line()`
12- Histogram: `geom_histogram()`
در جدول زیر بعضی از پارامترهای این تابع معرفی شدهاند.
پارامتر | عملکرد |
data | مجموعه داده که باید ترسیم شود |
mapping | تنظیم محورهای افقی و عمودی |
geometric object: | انتخاب نوع نمودار: |
geom_point() | نمودار نقطهای |
geom_bar() | نمودار میلهای |
geom_line() | نمودار خطی |
geom_histogram() | هیستوگرام |
بنابراین برای رسم نمودار نقطهای باید پارامتر Geometric Object را از نوع انتخاب کرد.
رسم نمودار نقطهای
فرض کنید دادههای مربوط به خودروهای mtcars در اختیارمان است. این «مجموعه داده» (Data.frame) دارای ۳۲ مشاهده و ۱۱ متغیر و یک ستون برچسب (ستون اول) است. جدول زیر به معرفی این متغیرها پرداخته.
نام متغیر | شرح |
mpg | مسافت طی شده با یک گالن سوخت |
cyl | تعداد سیلندر (از ۴ و ۶ و ۸) |
disp | فضای کابین (اینچ مکعب) |
hp | قدرت موتور (اسب بخار) |
drat | نسبت اکسل عقب (چرخدندههای دیفرانسیل) |
wt | وزن (برحسب ۱۰۰۰ پوند) |
qsec | زمان طی کردن یک چهارم مایل برحسب ثانیه |
vs | نوع موتور (0=خورجینی، ۱= خطی) |
am | نوع گیربکس (۰= اتوماتیک و ۱= دستی) |
gear | تعداد دندههای جلو (از ۳ تا ۵) |
carb | تعداد کاربراتور (1,2,3,6,8) |
برای آشنایی بیشتر با مجموعه داده mtcars و متغیرهای آن بهتر است مطلب روشهای رگرسیون در R — کاربرد در یادگیری ماشین (قسمت اول) و (قسمت دوم) را نیز بخوانید. با توجه به پارامترهای تابع ggplot و کتابخانه ggplot2 برای رسم نمودار نقطهای دادههای مربوط به مقایسه «نسبت اکسل محور» (drat) با «مسافت طی شده با یک گالن» (mpg) از کدهای زیر استفاده کردهایم.
1library(ggplot2)
2ggplot(mtcars, aes(x = drat, y = mpg)) +
3 geom_point()
همانطور که دیده میشود، ابتدا نام مجموعه داده mtcars و سپس متغیرهایی که باید روی هر محور ظاهر شوند به کمک پارامتر aes مشخص شده است. علامت + در انتها نیز به همراه نشانگر رسم نمودار نقطهای است. نتیجه اجرای این کد به صورت زیر خواهد بود.
براساس شکل این نمودار، متوجه میشویم که بین این دو متغیر رابطه مستقیمی برقرار است. به این معنی که با افزایش یکی دیگری نیز افزایش مییابد. این گونه نمودارها به درک رابطه بین دو متغیر کمی کمک میکند. همچنین برای کشف رابطه بین دو متغیر کمی براساس سطوح مختلف یک متغیر کیفی نیز میتوان از نمودار نقطهای استفاده کرد. در ادامه به بررسی چنین حالتی میپردازیم.
رسم نمودار نقطهای براساس متغیر طبقهای
فرض کنید میخواهیم نمودار قبلی را براساس نوع جعبه دنده (gear) رسم کنیم. این کار مشخص میکند که آیا نوع جعبه دنده در میزان ارتباط بین دو متغیر drat و mpg نقش دارد یا خیر. حتی بوسیله نموداری نقطهای که براساس متغیر طبقهای ترسیم شده، میتوان در هر سطح از متغیر کیفی، میزان ارتباط بین دو متغیر کمی را مشاهده کرد. کد زیر به این منظور تهیه شده است. همانطور که میبینید ابتدا متغیر gear با استفاده از تابع به متغیر عامل تبدیل شده و سپس در نمودار به کار رفته است.
1ggplot(mtcars, aes(x = mpg, y = drat)) +
2 geom_point(aes(color = factor(gear)))
پارامتر aes که در داخل نوشته شده است، رنگ گروهها را تعیین میکند. همانطور که دیده میشود، نوع جعبه دنده، رنگ هر نقطه را در نمودار مشخص کرده است. به نظر میرسد برای خودروهایی که دارای ۳ دنده هستند، رابطه خطی شدیدی وجود ندارد. در حالیکه برای خودروهای ۴ دندهای این رابطه بهتر دیده میشود. از طرفی تعداد خودروهای ۵ دنده نیز کم است و نمیتوان در مورد رابطه خطی بین متغیرهای کمی drat و mpg نظری دارد.
نکته: توجه داشته باشید که در این نمودار جای محور افقی و عمودی نسبت به نمودار قبلی تغییر یافته است. یعنی محور افقی برای نمایش mpg به کار رفته و محور عمودی نیز drat را نشان میدهد.
تغییر مقیاس محورها در نمودار نقطهای
تعیین مقیاس محورها یکی از مهمترین بخشها در ترسیم نمودار است. میتوان با تغییر مقیاس محورها، شیب تغییرات متغیرها را در نمودار کاهش یا افزایش داد. این کار اگر به درستی اجرا نشود، ممکن است بیننده را به گمراهی بکشد.
وجود دادههای با مقدارهای خیلی بزرگ یا خیلی کوچک باعث تغییر مقیاس محورها هنگام ترسیم با نرمافزارهای آماری میشود. تغییر مقیاس بوسیله تبدیل لگاریتمی میتواند اثر این گونه دادهها را کاهش دهد. کد زیر به این منظور تهیه شده است.
1ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
2 geom_point(aes(color = factor(gear)))
البته شیوههای دیگری نیز برای تبدیل دادهها و کاهش اثر نقاط پرت مانند انواع روشهای استاندارد سازی نیز وجود دارند. خروجی دستور بالا به صورت زیر خواهد بود. بهتر است مقدارهای مربوط به محورهای این نمودار را با نمودار قبلی مقایسه کنید. به نظر میرسد که این نمودار دارای مقیاسبندی بهتری نسبت به نمودار قبلی است.
نمودار نقطهای به همراه خط برازش رگرسیون
اگر از نمودار نقطهای برای نمایش رابطه خطی بین دو متغیر استفاده میکنید، بهتر است که خط مدل رگرسیونی (Linear Regression Model) را نیز به نمودارتان اضافه کنید تا قادر به پیشبینی دادههایی مربوط به متغیر وابسته برحسب متغیر مستقل باشیم. به این ترتیب میتوان براساس میزان مسافت طی شده با هر گالن سوخت، نسبت محور را برای هر خودرویی پیشبینی کرد. رسم چنین خطی به کمک کد زیر در نمودار قبلی صورت گرفته است.
1my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
2 geom_point(aes(color = factor(gear))) +
3 stat_smooth(method = "lm",
4 col = "#C42126",
5 se = FALSE,
6 size = 1)
7my_graph
همانطور که میبینید قسمت «هموار سازی» (Smoothing) به کمک تابع به کد قبلی اضافه شده است. روش هموار سازی در این نمودار «رگرسیون خطی» (Linear Regression) است. پارامتر () این خصوصیت را در کد مشخص کرده است. همچنین برای تعیین رنگ خط ترسیم از کد $$col =
نکته: روشهایی دیگری که برای هموار سازی (Smoothing) در نمودار نقطهای قابل استفاده هستند، در جدول زیر معرفی شدهاند.
پارامتر | عملکرد |
lm (Linear Model) | مدل خطی |
glm (Generalize Linear Model) | مدل خطی تعمیم یافته |
gam (Generalize Additive Model) | مدل جمعی تعمیم یافته |
loess (Local Polynomial Regression Fitting) | مدل برازش رگرسیون چند جملهای |
... | ... |
افزودن اطلاعات به نمودار
همانطور که قبلا گفته شد، نمودار به درک و شناخت بیشتر اطلاعات موجود در دادهها کمک میکند. بنابراین اضافه کردن توضیحات در کنار آن نیز بسیار موثر خواهد بود. به کمک تابع از کتابخانه ggplot2 این کار امکان پذیر است. شکل کلی و پارامترهای مربوط به تابع به صورت زیر است.
1lab()
2
3argument:
4- title: Control the title. It is possible to change or add title with:
5- subtitle: Add subtitle below title
6- caption: Add caption below the graph
7- x: rename x-axis
8- y: rename y-axis
در جدول زیر عملکرد این پارامترها را مشاهده میکنید.
پارامتر | عملکرد |
title | عنوان نمودار |
subtitle | زیرعنوان نمودار |
caption | زیر نویس نمودار |
x | نامگذاری محور x |
y | نام گذاری محور y |
به این ترتیب کد زیر که براساس خروجی دستور ایجاد میشود، نموداری همراه با عنوان ایجاد میکند.
1my_graph +
2 labs(
3 title = "Plot Mile per hours and drat, in log"
4 )
با اجرای این کد یک عنوان در بالای صفحه به همراه نمودار ظاهر میشود که بیان میکند که محورها با مقیاس لگاریتمی ایجاد شدهاند.
برای ایجاد عنوان در نمودار میتوانید از مقدار متغیرها نیز استفاده کنید. برای مثال اگر بخواهید میانگین مسافت طی شده با هر گالن (mpg) را در عنوان نمودار قرار دهید کافی است از تابع استفاده کنید. به کد زیر توجه کنید. تابع قادر است، عبارتهای متنی و متغیرها را به یکدیگر پیوند داده و به صورت یک عبارت متنی درآورد.
1mean_mpg <- mean(mtcars$mpg)
2my_graph + labs(
3 title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg)
4)
خروجی این دستورات در تصویر زیر دیده میشود.
برای اضافه کردن زیر عنوان و زیرنویس در نمودار نیز باید پارامترهای subtitle و caption را نیز تکمیل کنید. در ادامه یک مثال برای اضافه کردن این اجزا به نمودار قبلی مورد بررسی قرار گرفته است.
1my_graph +
2 labs(
3 title =
4 "Relation between Mile per hours and drat",
5 subtitle =
6 "Relationship break down by gear class",
7 caption = "Authors own computation"
8 )
محل قرارگیری هر یک از این اجزا در تصویر زیر دیده میشود.
اگر لازم است که اسامی محورهای افقی یا عمودی را تغییر دهید، از پارامترهای دیگر تابع مانند x و y استفاده کنید. فرض کنید قرار است عنوان محور افقی به "Drat definition" و عنوان محور عمودی به "Mile per hours" تغییر پیدا کند. پارامترها را به صورت زیر تنظیم میکنیم.
1my_graph +
2 labs(
3 x = "Drat definition",
4 y = "Mile per hours",
5 color = "Gear",
6 title = "Relation between Mile per hours and drat",
7 subtitle = "Relationship break down by gear class",
8 caption = "Authors own computation"
9 )
با این کار یک نمودار نقطهای با اسمی مورد نظر برای محورها رسم میشود. توجه داشته باشید که برچسب مربوط به متغیر gear که رنگ نقطهها را مشخص میکرد در نمودارهای قبلی بود که به کمک پارامترهای تابع به Gear تغییر پیدا کرده است.
همچنین از پارامترهای scale برای تغییر علامت جداکننده روی محورهای افقی و عمودی استفاده کنید. برای مثال فرض کنید قرار است که برای محور افقی علامتهای جداکننده از ۱ تا ۳.۶ با افزایشی برابر با 0.2 ایجاد شوند. همین کار را برای محور عمودی نیز باید با مقدارهای از ۱ تا 1.6 با افزایشی برابر با 0.1 انجام دهیم. کدهای زیر به این منظور تهیه شدهاند.
1my_graph +
2 scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
3 scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
4 labs(
5 x = "Drat definition",
6 y = "Mile per hours",
7 color = "Gear",
8 title = "Relation between Mile per hours and drat",
9 subtitle = "Relationship break down by gear class",
10 caption = "Authors own computation"
11 )
مشخص است که scale_x_continuous پارامتر مربوط به محور افقی و scale_y_continuous مربوط به محور عمودی است. همچنین دستور نیز با سه پارامتر به کار رفته است. پارامتر اول نقطه شروع، پارامتر دوم نقطه پایانی و by نیز میزان افزایش را برای دنباله نقاط جداکننده روی محورها مشخص میکند.
نکته: از آنجایی که دو متغیر محور افقی و عمودی پیوسته هستند از تابع scale_continuous استفاده شده است. اگر مقدارهای مربوط به محورها گسسته یا کیفی باشند میتوان از تابع scale_discrete بهره برد.
استفاده از الگوهای زمینه (Themes)
رنگآمیزی و انتخاب رنگهای مناسب برای نمودار ممکن است کار مشکلی باشد. الگوهای زمینه زیادی برای رسم نمودارها در کتابخانه ggplot2 وجود دارد.
کافی است نام یکی از آنها را در کنار تابع theme به کار ببرید تا نمودارتان جلوه مناسبتری پیدا کند. بعضی از این الگوهای زمینه در جدول زیر معرفی شدهاند.
نام الگو | خصوصیات |
theme_gray | زمینه خاکستری، خطوط شبکهای سفید |
theme_bw | سیاه و سفید |
theme_linedraw | خطوط سیاه نازک، زمینه سفید |
theme_light | خطوط خاکستری نازک، زمینه سفید |
theme_dark | زمینه خاکستری تیره |
theme_minimal | بدون زمینه برای نوشتههای نمودار |
theme_classic | بدون خطوط شبکهای |
theme_void | بدون هیچ الگوی |
... | ... |
برای مثال اگر بخواهیم نمودار قبلی را به استفاده از الگوی زمینه خاکستری تیره ایجاد کنیم دستور زیر را باید به کدهای قبلی اضافه کنیم.
1my_graph +
2 theme_dark() +
3 labs(
4 x = "Drat definition, in log",
5 y = "Mile per hours, in log",
6 color = "Gear",
7 title = "Relation between Mile per hours and drat",
8 subtitle = "Relationship break down by gear class",
9 caption = "Authors own computation"
10 )
خروجی به صورت زیر در خواهد آمد.
برای ذخیره سازی نتایج خروجی دستور ggplot کافی است از تابع ggsave استفاده کنید. برای مثال کد زیر تصویر نمودار را با قالب png به اسم my_fantastic_plot ذخیره میکند.
1ggsave("my_fantastic_plot.png")
محل ذخیره سازی این نمودار پوشه پیشفرض در R خواهد بود.
خلاصه
جدول زیر به طور مختصر پارامترها و شکل دستوری تابع ggplot را برای رسم نمودار نقطهای مرور کرده است.
دستور و پارامترها | عملکرد |
ggplot(df, aes(x = x1, y = y)) + geom_point() | رسم نمودار نقطهای |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x1)) + stat_smooth(method = "lm") | رسم نمودار نقطهای به همراه خط برازش |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x1)) | رسم نمودار نقطهای به تفکیک متغیر فاکتور |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("scatter plot")) | رسم نمودار نقطهای به همراه عنوان |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("scatter plot x1 and y")) | رسم نمودار نقطهای به همراه زیر عنوان |
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() | استفاده از الگوی زمینهای کلاسیک |
ggsave("file name and format") | ذخیره نمودار با نام و انتخاب نوع فایل تصویری |
اگر مطلب بالا برای شما مفید بوده، آموزشها و مطالب زیر نیز که در زمینه به کارگیری آمار و محاسبات در نرمافزار R هستند، به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- مجموعه آموزشهای هوش محاسباتی
- آموزش برنامهنویسی R و نرمافزار R Studio
- آموزش تکمیلی برنامهنویسی R و نرمافزار RStudio
- توابع Apply در زبان برنامه نویسی R — راهنمای کاربردی
- تبدیل و پاکسازی داده ها با کتابخانه dplyr و tidyr در R — راهنمای کاربردی
^^