نمودار نقطه ای (Scatter Plot) در R — راهنمای کاربردی

۱۷۲۴ بازدید
آخرین به‌روزرسانی: ۰۶ خرداد ۱۴۰۲
زمان مطالعه: ۹ دقیقه
نمودار نقطه ای (Scatter Plot) در R — راهنمای کاربردی

یکی از بخش‌های مهم در «تحلیل داده‌ها» (Data Analysis)، «بصری سازی داده‌ها» (Data Visualization) است. رسم نمودارها یکی از روش‌های معمول در بصری‌سازی یا نمایش داده‌ها است. در این نوشتار با شیوه ترسیم «نمودارهای نقطه‌ای» (Scatter Plot) با استفاده از کتابخانه ggplot2 در زبان برنامه نویسی R می‌پردازیم.

نمودار نقطه‌ای، برای نمایش مقدارهای عددی و متغیرهای کمی به کار می‌رود. به این ترتیب می‌توان رابطه بین متغیرهای کمی را درک و نمایش داد. کتابخانه ggplot2 شامل توابع متنوعی برای ترسیم این گونه نمودارها است. در این نوشتار سعی می‌کنیم با ذکر مثال‌هایی، با دستورات و شیوه ترسیم نمودار نقطه‌ای آشنا شویم.

نوشتار نمایش و رسم نمودار برای داده‌ها — معرفی و کاربردها به معرفی انواع نمودارها پرداخته است. به عنوان مقدمه،‌ پیشنهاد می‌شود که این متن را مطالعه کنید. از آنجایی که برای مقایسه متغیرهای کمی در سطوح مختلف متغیر کیفی یا فاکتور از نمودار نقطه‌ای نیز می‌توان استفاده کرد، خواندن متغیر فاکتور (Factor) یا متغیر عامل در R — راهنمای کاربردی خالی از لطف نیست.

نمودار نقطه‌ای (Scatter Plot)

در این نوشتار براساس کتابخانه ggplot2 و توابع آن به رسم نمودار نقطه‌ای در حالت‌های مختلف می‌پردازیم.

Scatter-Plot

ویژگی‌ مهمی که کتابخانه 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 را از نوع $$geom\_point() $$ انتخاب کرد.

رسم نمودار نقطه‌‌ای

فرض کنید داده‌های مربوط به خودروهای 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 مشخص شده است. علامت + در انتها نیز به همراه $$geom\_point()$$ نشانگر رسم نمودار نقطه‌ای است. نتیجه اجرای این کد به صورت زیر خواهد بود.

Scatterplot1

براساس شکل این نمودار، متوجه می‌شویم که بین این دو متغیر رابطه‌ مستقیمی برقرار است. به این معنی که با افزایش یکی دیگری نیز افزایش می‌یابد. این گونه نمودارها به درک رابطه بین دو متغیر کمی کمک می‌کند. همچنین برای کشف رابطه بین دو متغیر کمی براساس سطوح مختلف یک متغیر کیفی نیز می‌توان از نمودار نقطه‌ای استفاده کرد. در ادامه به بررسی چنین حالتی می‌پردازیم.

رسم نمودار نقطه‌ای براساس متغیر طبقه‌ای

فرض کنید می‌خواهیم نمودار قبلی را براساس نوع جعبه دنده (gear) رسم کنیم. این کار مشخص می‌کند که آیا نوع جعبه دنده در میزان ارتباط بین دو متغیر drat و mpg‌ نقش دارد یا خیر. حتی بوسیله نموداری نقطه‌ای که براساس متغیر طبقه‌ای ترسیم شده، می‌توان در هر سطح از متغیر کیفی، میزان ارتباط بین دو متغیر کمی را مشاهده کرد. کد زیر به این منظور تهیه شده است. همانطور که می‌بینید ابتدا متغیر gear با استفاده از تابع $$factor()$$ به متغیر عامل تبدیل شده و سپس در نمودار به کار رفته است.

1ggplot(mtcars, aes(x = mpg, y = drat)) +
2    geom_point(aes(color = factor(gear)))

پارامتر aes‌ که در داخل $$geom\_point()$$ نوشته شده است، رنگ گروه‌ها را تعیین می‌کند. همانطور که دیده می‌شود، نوع جعبه دنده، رنگ هر نقطه را در نمودار مشخص کرده است. به نظر می‌رسد برای خودروهایی که دارای ۳ دنده هستند، رابطه خطی شدیدی وجود ندارد. در حالیکه برای خودروهای ۴ دنده‌ای این رابطه بهتر دیده می‌شود. از طرفی تعداد خودروهای ۵ دنده نیز کم است و نمی‌توان در مورد رابطه خطی بین متغیرهای کمی drat و mpg‌ نظری دارد.

نکته: توجه داشته باشید که در این نمودار جای محور افقی و عمودی نسبت به نمودار قبلی تغییر یافته است. یعنی محور افقی برای نمایش mpg به کار رفته و محور عمودی نیز drat را نشان می‌دهد.

Scatter plot for groups

تغییر مقیاس محورها در نمودار نقطه‌ای

تعیین مقیاس محورها یکی از مهم‌ترین بخش‌ها در ترسیم نمودار است. می‌توان با تغییر مقیاس محورها، شیب تغییرات متغیرها را در نمودار کاهش یا افزایش داد. این کار اگر به درستی اجرا نشود، ممکن است بیننده را به گمراهی بکشد.

وجود داده‌های با مقدارهای خیلی بزرگ یا خیلی کوچک باعث تغییر مقیاس محورها هنگام ترسیم با نرم‌افزارهای آماری می‌شود. تغییر مقیاس بوسیله تبدیل لگاریتمی می‌تواند اثر این گونه داده‌ها را کاهش دهد. کد زیر به این منظور تهیه شده است.

1ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
2    geom_point(aes(color = factor(gear)))

البته شیوه‌های دیگری نیز برای تبدیل داده‌ها و کاهش اثر نقاط پرت مانند انواع روش‌های استاندارد سازی نیز وجود دارند. خروجی دستور بالا به صورت زیر خواهد بود. بهتر است مقدارهای مربوط به محورهای این نمودار را با نمودار قبلی مقایسه کنید. به نظر می‌رسد که این نمودار دارای مقیاس‌بندی بهتری نسبت به نمودار قبلی است.

data transformation in Scatter plot

نمودار نقطه‌ای به همراه خط برازش رگرسیون

اگر از نمودار نقطه‌ای برای نمایش رابطه خطی بین دو متغیر استفاده می‌کنید، بهتر است که خط مدل رگرسیونی (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) به کمک تابع $$stat\_smooth()$$ به کد قبلی اضافه شده است. روش هموار سازی در این نمودار «رگرسیون خطی» (Linear Regression) است. پارامتر ($$method= 'lm'$$) این خصوصیت را در کد مشخص کرده است. همچنین برای تعیین رنگ خط ترسیم از کد $$col = "#C42126"$$ استفاده شده است. سطر $$se = FALSE$$ نمایش خطوط مربوط به خطای استاندارد را کنسل کرده است. همچنین اندازه خط ترسیمی نیز توسط پارامتر $$size = 1$$ مشخص شده. این خروجی در متغیر $$my\_graph$$ ثبت و در انتها نیز نمودار ظاهر شده است.

fitted line for scatter plot

نکته: روش‌هایی دیگری که برای هموار سازی (Smoothing) در نمودار نقطه‌ای قابل استفاده هستند، در جدول زیر معرفی شده‌اند.

پارامترعملکرد
  lm (Linear Model)مدل خطی
  glm (Generalize Linear Model)مدل خطی تعمیم یافته
  gam (Generalize Additive Model)مدل‌ جمعی تعمیم یافته
  loess (Local Polynomial Regression Fitting)مدل برازش رگرسیون چند جمله‌ای
......

 افزودن اطلاعات به نمودار

همانطور که قبلا گفته شد، نمودار به درک و شناخت بیشتر اطلاعات موجود در داده‌ها کمک می‌کند. بنابراین اضافه کردن توضیحات در کنار آن نیز بسیار موثر خواهد بود. به کمک تابع $$lab()$$ از کتابخانه ggplot2 این کار امکان پذیر است. شکل کلی و پارامترهای مربوط به تابع $$lab()$$ به صورت زیر است.

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

به این ترتیب کد زیر که براساس خروجی دستور $$my\_graph$$ ایجاد می‌شود، نموداری همراه با عنوان ایجاد می‌کند.

1my_graph +
2    labs(
3        title = "Plot Mile per hours and drat, in log"
4         )

با اجرای این کد یک عنوان در بالای صفحه به همراه نمودار ظاهر می‌شود که بیان می‌کند که محورها با مقیاس لگاریتمی ایجاد شده‌اند.

Annotation in scatter plot

برای ایجاد عنوان در نمودار می‌توانید از مقدار متغیرها نیز استفاده کنید. برای مثال اگر بخواهید میانگین مسافت طی شده با هر گالن (mpg) را در عنوان نمودار قرار دهید کافی است از تابع $$paste()$$‌ استفاده کنید. به کد زیر توجه کنید. تابع $$paste()$$ قادر است، عبارت‌های متنی و متغیرها را به یکدیگر پیوند داده و به صورت یک عبارت متنی درآورد.

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)

خروجی این دستورات در تصویر زیر دیده می‌شود.

dynamic annotation in scatter plot

برای اضافه کردن زیر عنوان و زیرنویس در نمودار نیز باید پارامترهای 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    )

محل قرارگیری هر یک از این اجزا در تصویر زیر دیده می‌شود.

general annotation in scatter plot

اگر لازم است که اسامی محورهای افقی یا عمودی را تغییر دهید، از پارامترهای دیگر تابع $$lab()$$ مانند 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 که رنگ نقطه‌ها را مشخص می‌کرد در نمودارهای قبلی $$factor(gear)$$ بود که به کمک پارامترهای تابع $$lab()$$ به Gear تغییر پیدا کرده است.

labeling axis in Scatter plot

همچنین از پارامترهای 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 مربوط به محور عمودی است. همچنین دستور $$seq()$$ نیز با سه پارامتر به کار رفته است. پارامتر اول نقطه شروع، پارامتر دوم نقطه پایانی و by نیز میزان افزایش را برای دنباله نقاط جداکننده روی محورها مشخص می‌کند.

labeled scale Scatter plot

نکته: از آنجایی که دو متغیر محور افقی و عمودی پیوسته هستند از تابع 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 هستند، به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *