نمودار میله ای (Bar Chart) در R — راهنمای کاربردی
مباحث مربوط به «مصور سازی داده» (Data Visualization) یکی از مهمترین بخشهای «تحلیل داده» (Data Analysis) محسوب میشود. این کار بوسیله رسم نمودارها، بخصوص «نمودار میلهای» (Bar Chart) امکان پذیر است.
در این نوشتار به معرفی نمودار میلهای پرداخته و شیوه مختلف ترسیم آن را با استفاده از دستورات و توابع کتابخانه ggplot2 در زبان برنامهنویسی R فرا میگیریم. در این بین برای اجرا و ویرایش کدها از محیط Rstudio بهره خواهیم برد.
برای آشنایی بیشتر با انواع نمودارها و خصوصیات هر یک بهتر است مطلب نمایش و رسم نمودار برای دادهها — معرفی و کاربردها را مطالعه کرده باشید. همچنین به منظور آشنایی با متغیرهای طبقهای که در نمودار میلهای به کار میروند، خواندن نوشتار متغیر فاکتور (Factor) یا متغیر عامل در R — راهنمای کاربردی خالی از لطف نیست. در این مطلب نیز از مجموعه داده mtcars کمک گرفته و از متغیرهای cylc ،am و mpg بهره میبریم.
نمودار میله ای (Bar Chart)
نمودار میلهای دارای دو محور برای مشخص کردن متغیرها است. در این نمودار معمولا محور افقی برای نمایش مقادیر متغیر طبقهای است. همچنین محور عمودی نیز به مقایسه بین تعداد گروهها یا شاخصی از متغیرهای کمی اختصاص دارد. بنابراین مقادیر عددی باید در محور عمودی قرار گیرند.
به این منظور کدها را در دو بخش ارائه میکنیم. در اولین بخش، محور عمودی براساس شمارش اعضای هر گروه یا طبقه مقدار دهی میشود و در بخش دوم، شاخص آماری مانند میانگین، حداکثر و ... روی محور عمودی دیده خواهد شد. برای ایجاد نمودار میلهای در کتابخانه ggplot2 از تابع استفاده خواهیم کرد. پارامترهای این دستور به صورت زیر است.
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 objects are:
8
9- Point: `geom_point()`
10- Bar: `geom_bar()`
11- Line: `geom_line()`
12- Histogram: `geom_histogram()`
برای آشنایی با پارامترهای تابع ggplot بهتر است مطلب نمودار نقطهای (Scatter Plot) در R — راهنمای کاربردی را بخوانید. همانطور که مشخص است در اینجا پارامتر را به کار خواهیم گرفت.
نمودار میلهای (Bar Chart) براساس شمارش یا درصد در طبقات
ابتدا به بررسی نمودار فراوانی تعداد سیلندرها بوسیله نمودار میلهای با تابع میپردازیم. کد زیر به این کار اختصاص یافته است.
1library(ggplot2)
2# Most basic bar chart
3ggplot(mtcars, aes(x = factor(cyl))) +
4 geom_bar()
همانطور که مشخص است ورودیهای تابع ggplot به ترتیب عبارتند از:
- mtcars که نام مجموعه داده برای ترسیم نمودار است.
- پارامتر aes که مربوط به متغیرهای به کار رفته در محور افقی است. در اینجا به معنی نمایش تعداد سیلندرها در محور افقی است.
- در انتها نیز به معنی ترسیم نمودار میلهای برای مجموعه داده mtcars است.
خروجی با اجرای این کدها به صورت زیر خواهد بود.
نکته: به تغییر متغیر cyl به متغیر عامل یا طبقهای توجه داشته باشید. محور افقی محل قرارگیری متغیرهای عامل است.
سفارشی کردن نمودار میلهای
برای تغییر رنگ میلههای نمودار، میتوان از دستور و استفاده کنید. کد زیر به این منظور تهیه شده است.
1# Change the color of the bars
2ggplot(mtcars, aes(x = factor(cyl))) +
3 geom_bar(fill = "coral") +
4 theme_classic()
مشخص است که پارامتر به منظور تعیین رنگ میلهها به کار رفته است. توجه داشته باشید که این پارامتر درون تابع قرار گرفته است. خروجی به صورت زیر درخواهد آمد.
نکته: برای مشاهده کد رنگها قابل دسترس در R کافی است دستور را اجرا کنید. با این کار، حدود ۶۵7 رنگ به همراه کدهایشان در اختیارتان قرار میگیرد.
برای تغییر شدت رنگ میلهها نیز از پارامتر alpha استفاده میشود. مقدار 0 برای این پارامتر رنگ روشن و مقدار ۱ تیرهترین حالت رنگ را ایجاد میکند. برای مثال کد زیر به منظور روشن کردن رنگ نارنجی به کار رفته است.
1# Change intensity
2ggplot(mtcars,
3 aes(factor(cyl))) +
4 geom_bar(fill = "coral",
5 alpha = 0.5) +
6 theme_classic()
به این ترتیب خروجی به صورت زیر در خواهد آمد.
همچنین میتوان رنگ ستونها را براساس هر سطح از متغیر عامل تغییر دارد. در این حالت کافی است که رنگ هر ستون را براساس مقدار متغیر عامل تعیین کرد. توجه کنید که پارامتر fill در تابع ggplot به کار رفته تا رنگ هر ستون جداگانه تعیین شود.
1# Color by group
2ggplot(mtcars, aes(factor(cyl),
3 fill = factor(cyl))) +
4 geom_bar()
حاصل اجرای این کد نموداری است که در زیر دیده شده و برای هر ستون رنگ متفاوتی را در نظر گرفته است.
اگر لازم باشد که نمودار میلهای را برحسب یک متغیر طبقهای تفکیک کرد، از شکل دستوری زیر استفاده میکنیم. مشخص است که ابتدا متغیر طبقهای توسط تابع ایجاد شده و سپس برای رسم نمودار به کار گرفته شده است. برای اجرای این کار از کتابخانه dplyr استفاده شده.
1library(dplyr)
2# Step 1
3data <- mtcars %>%
4#Step 2
5mutate(am = factor(am, labels = c("auto", "man")),
6 cyl = factor(cyl))
به این ترتیب دو برچسب auto ،man برای مقدارهای مختلف متغیر am به کار رفته است که اولی نشانگر دستی بودن جعبه دنده و دومی به معنی اتوماتیک بودن سیستم تعویض دنده خودرو است. این دادهها در data ذخیره شدهاند.
حال به کمک پارامتر fill در تابع ggplot به ترسیم نمودار پرداختهایم.
1ggplot(data, aes(x = cyl, fill = am)) +
2 geom_bar() +
3 theme_classic()
تصویر زیر به خوبی تغییر شکل نمودار و بهرهگیری از دو متغیر طبقهای در نمودار میلهای را نشان میدهد. البته مشخص است که نمودار برحسب نوع جعبه دنده به صورت «تجمعی» (stacked) ترسیم شده است. برای هر گروه از متغیر سیلندر، تعداد خودروهای اتوماتیک و دستی در یک ستون درون نمودار دیده میشوند.
به جای آنکه میلههای مربوط به تعداد هر گروه روی یکدیگر ظاهر شوند میتوان آنها را در کنار یکدیگر قرار داد. این کار به وسیله پارامتر position انجام میشود. به مثال زیر توجه کنید.
1# Bar chart side by side
2ggplot(data, aes(x = cyl, fill = am)) +
3 geom_bar(position = position_dodge()) +
4 theme_classic()
میتوانید پارامتر position را به دو مقدار یا مقداردهی کنید که اولی یک شیء مکانی و دومی یک رشته متنی است.
گاهی لازم است که محور افقی به جای نمایش دادن تعداد، درصدی از مشاهدات که به یک گروه یا طبقه تعلق دارند را نشان دهد. کد زیر به این منظور نوشته شده است. به پارامتر position و مقدار fill که مقداری متنی است، دقت کنید. این کار باعث میشود که نمودار به صورت درصدی- تجمعی ظاهر شود.
1ggplot(data, aes(x = cyl, fill = am)) +
2 geom_bar(position = "fill") +
3 theme_classic()
به این نمودار، نمودار میلهای درصدی میگویند. همه ستونها با ۱ یا همان ۱۰۰٪ برابرند ولی میتوان مشاهده کرد که هر گروه چه درصدی از کل آن طبقه است. برای مثال مشخص است که بیشتر خودروهای هشت سیلندر از نوع جعبه دنده اتوماتیک هستند. ولی در طبقه خودروهای ۶ سیلندر نوع جعبه دنده دستی و اتوماتیک یکسان است. همینطور در رده یا طبقه خودروهای ۴ سیلندر سهم جعبه دنده دستی تقریبا سه برابر جعبه دنده اتوماتیک است.
نمودار میلهای (Bar Chart) براساس شاخص متغیر کمی
بخش دوم این نوشتار به بررسی شکل دیگری از نمودار میلهای میپردازد که در آن از یک متغیر کمی نیز استفاده میشود. فرض کنید متغیر mpg نیز به مجموعه متغیرهای ما اضافه شده که بیانگر میزان مسافت طی شده با هر گالن سوخت است.
هدف آن است که خودروهای مختلف از لحاظ تعداد سیلندر را براساس mpg مقایسه کنیم. انتظار داریم که خودروهای با سیلندر بیشتر بطور متوسط نسبت به خودروهای دیگر مسافت کمتری را طی کنند. به این منظور از نمودار میلهای استفاده خواهیم کرد.
گام اول
ابتدا باید شاخص میانگین را برای گروههای مختلف خودروها برحسب سیلندر محاسبه کنیم. این کار با استفاده کد زیر صورت گرفته است. نتایج این محاسبات که روی مجموعه داده mtcars صورت گرفته است در متغیر data_cat قرار گرفته است.
1data_cat <- mtcars %>%
2 mutate(cyl = factor(cyl)) %>%
3 group_by(cyl) %>%
4 summarize(mean_mpg = round(mean(mpg), 2))
گام دوم
رسم نمودار میلهای در این مرحله با مشخص کردن مقدارهای محور عمودی به عنوان پارامتر تابع ggplot است. به کد زیر دقت کنید.
1ggplot(data_cat, aes(x = cyl, y = mean_mpg)) +
2 geom_bar(stat = "identity")
به بخش دقت کنید. با ذکر این گزینه مشخص میکنید که دیگر نمیخواهید تعداد یا درصد روی محور عمودی قرار گیرد. اگر پارامتر را در بخش اول ذکر کرده باشید، وجود پارامتر ضروری است. نتیجه به صورت زیر در خواهد آمد.
اگر لازم باشد میتوانید جای محور افقی و عمودی را تغییر دهید و به جای نمودار میلهای، نمودار ستونی ترسیم کنید. این کار به کمک پارامتر صورت میگیرد.
1ggplot(data_cat, aes(x = cyl, y = mean_mpg)) +
2 geom_bar(stat = "identity") +
3 coord_flip()
همانطور که میبینید این پارامتر از توابع کتابخانه ggplot2 است که با علامت + به انتهای کد قبلی اضافه شده. نتیجه در زیر قابل مشاهده است.
برای تغییر رنگ و تنوع در شکل نمایش نمودار نیز باز هم از توابع کتابخانه ggplot2 استفاده خواهیم کرد و پارامتر و الگوی کلاسیک را به کار میبریم.
1ggplot(data_cat, aes(x = cyl, y = mean_mpg, fill = cyl)) +
2 geom_bar(stat = "identity") +
3 coord_flip() +
4 theme_classic()
برای تغییر اندازه میلهها نیز از پارامتر width استفاده کرده و اندازه میلهها را به نصف کاهش میدهیم. در این مرحله نمودار را در یک متغیر به نام graph ذخیره میکنیم تا امکان اضافه کردن پارامترهای دیگر به کمک + را به راحتی در اختیار بگیریم.
1graph <- ggplot(data_cat, aes(x = cyl, y = mean_mpg, fill = cyl)) +
2 geom_bar(stat = "identity",
3 width = 0.5) +
4 coord_flip() +
5 theme_classic()
نکته: مقدار width به صورت درصدی است به این معنی که این مقدار درصدی از فضای موجود بین گروهها در محور طبقه را نشان میدهد؛ معمولا این مقدار به صورت پیشفرض 0.9 در نظر گرفته شده است. اگر مقدار آن را برابر با ۱ در نظر بگیرید، میلهها یا ستونهای مربوط به گروهها به صورت چسبیده به یکدیگر ظاهر خواهند شد.
به منظور خوانایی نمودار بهتر است روی هر کدام از میلهها، برچسب مربوط به مقدارها نیز ظاهر شود. تابع به این منظور در کتابخانه ggplot2 گنجانده شده است. در این جا از پارامتر label برای برچسبگذاری و از متغیر mean_mpg نیز به عنوان مقدار برچسب استفاده کردهایم.
همچنین پارامتر hjust برای نشان دادن برچسب در بالای ستونها و فاصله از انتهای میلهها به کار رفته و color و size نیز مربوط به رنگ و اندازه قلم نوشتههای برچسبها هستند.
1graph +
2 geom_text(aes(label = mean_mpg),
3 hjust = 1.5,
4 color = "white",
5 size = 3) +
6 theme_classic()
پس از اجرای این کد، خروجی به مانند تصویر زیر قابل مشاهده است. همانطور که مشخص است کافی است به خروجی دستور قبلی (graph) به همراه + کدهای قالببندی را اضافه کنیم تا نتیجه رضایت بخش شود.
نکته: اگر میخواهید همه مقدارهای مربوط به مشاهدات متغیر کمی روی نمودار به ترتیب ظاهر شوند کافی است از کد زیر کمک بگیرید. این دستورات با فرض اینکه هر یک از مشاهدات دارای کدی از ۱ تا ۳۲ هستند (تعداد کل خودروها) نوشته شده است. همچنین به منظور برچسبگذاری روی محورها و نمایش همه مقدارهای مربوطه از کد زیر بهره گرفته شده.
1ggplot(mtcars, aes(x=1:32,y= mtcars$mpg))+
2 labs(x="Indeviduals", y="Miles per Galon")+
3 geom_bar(stat = "identity",fill=1:32)+
4 geom_text(aes(label=mtcars$mpg),vjust=5,color="white",size=2)+theme_classic()
نتیجه مطابق تصویر زیر خواهد بود.
خلاصه
در جدول زیر دستورات و پارامترهای مرتبط با رسم نمودار میلهای در کتابخانه ggplot2 آورده شده است. یاددآوری میکنیم که نمودار میلهای به منظور مقایسه بین تعداد، درصد یا شاخصی از متغیر کمی برای ردههای مختلف یک متغیر طبقهای مناسب است.
منظور از df مجموعه داده و x1 ،x2 نیز بیانگر متغیر طبقهای هستند.
هدف | کد |
رسم نمودار میلهای براساس تعداد اعضای هر گروه | |
رسم نمودار میلهای براساس تعداد اعضای هر گروه با در نظر گرفتن رنگ متفاوت برای هر گروه | |
رسم نمودار میلهای براساس تعداد اعضا به صورت تجمعی- پشتهای (stacked) برحسب متغیر عامل (فاکتور) | |
رسم نمودار میلهای براساس تعداد اندازه متغیر عامل (فاکتور) | |
رسم نمودار میلهای براساس تعداد اعضا به صورت تجمعی- پشتهای (stacked) درصدی، برحسب متغیر عامل (فاکتور) |
اگر مطلب بالا برای شما مفید بوده است، آموزشها و مطالب زیر نیز که در زمینه به کارگیری آمار و محاسبات در نرمافزار R هستند، به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- آموزش برنامهنویسی R و نرمافزار R Studio
- آموزش تکمیلی برنامهنویسی R و نرمافزار RStudio
- نمودار نقطه ای (Scatter Plot) در R — راهنمای کاربردی
- توابع Apply در زبان برنامه نویسی R — راهنمای کاربردی
- تبدیل و پاکسازی داده ها با کتابخانه dplyr و tidyr در R — راهنمای کاربردی
^^