Scatter Plot ใน R โดยใช้ ggplot2 (พร้อมตัวอย่าง)
กราฟเป็นส่วนที่สามของกระบวนการวิเคราะห์ข้อมูล ภาคแรกเป็นเรื่องเกี่ยวกับ การดึงข้อมูลส่วนที่สองเกี่ยวข้องกับ ทำความสะอาดและจัดการข้อมูล- ในที่สุด Data Scientist ก็อาจจำเป็นต้องทำ สื่อสารผลลัพธ์ของเขาแบบกราฟิก.
สามารถดูงานของนักวิทยาศาสตร์ข้อมูลได้จากภาพต่อไปนี้
- งานแรกของนักวิทยาศาสตร์ข้อมูลคือการกำหนดคำถามการวิจัย คำถามวิจัยนี้ขึ้นอยู่กับวัตถุประสงค์และเป้าหมายของโครงการ
- หลังจากนั้นงานที่โดดเด่นที่สุดอย่างหนึ่งก็คือวิศวกรรมฟีเจอร์ นักวิทยาศาสตร์ข้อมูลจำเป็นต้องรวบรวม จัดการ และทำความสะอาดข้อมูล
- เมื่อขั้นตอนนี้เสร็จสิ้น เขาสามารถเริ่มสำรวจชุดข้อมูลได้ บางครั้งจำเป็นต้องปรับปรุงและเปลี่ยนแปลงสมมติฐานเดิมเนื่องจากการค้นพบครั้งใหม่
- เมื่อราคาของ อธิบาย การวิเคราะห์ข้อมูลทำได้สำเร็จแล้ว Data Scientist จะต้องคำนึงถึงความสามารถของผู้อ่านด้วย เข้าใจแนวคิดและโมเดลพื้นฐาน.
- ผลลัพธ์ของเขาควรนำเสนอในรูปแบบที่ผู้มีส่วนได้ส่วนเสียทุกคนสามารถเข้าใจได้ หนึ่งในวิธีที่ดีที่สุดในการ สื่อสาร ผลลัพธ์คือผ่าน กราฟ.
- กราฟเป็นเครื่องมือที่น่าทึ่งในการทำให้การวิเคราะห์ที่ซับซ้อนง่ายขึ้น
แพ็คเกจ ggplot2
บทช่วยสอนในส่วนนี้จะเน้นที่วิธีสร้างกราฟ/แผนภูมิด้วย R
ในบทช่วยสอนนี้ คุณจะใช้แพ็คเกจ ggplot2 แพ็คเกจนี้สร้างขึ้นจากหนังสือ Grammar of Graphics ที่เขียนโดย Wilkinson, 2005 อย่างต่อเนื่อง ggplot2 มีความยืดหยุ่นมาก รวมธีมต่างๆ มากมายและข้อกำหนดเฉพาะของพล็อตเรื่องในระดับนามธรรมในระดับสูง ด้วย ggplot2 คุณจะไม่สามารถพล็อตกราฟิก 3 มิติและสร้างกราฟิกเชิงโต้ตอบได้
ใน ggplot2 กราฟประกอบด้วยอาร์กิวเมนต์ดังต่อไปนี้:
- ข้อมูล
- การทำแผนที่สุนทรียภาพ
- วัตถุทางเรขาคณิต
- การเปลี่ยนแปลงทางสถิติ
- ตาชั่ง
- ระบบพิกัด
- การปรับตำแหน่ง
- เผชิญหน้า
คุณจะได้เรียนรู้วิธีควบคุมข้อโต้แย้งเหล่านั้นในบทช่วยสอน
ไวยากรณ์พื้นฐานของ 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()`
พล็อตกระจาย
มาดูกันว่า ggplot ทำงานอย่างไรกับชุดข้อมูล mtcars คุณเริ่มต้นด้วยการวางแผน Scatterplot ของตัวแปร mpg และตัวแปร drat
พล็อตกระจายพื้นฐาน
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
คำอธิบายรหัส
- ก่อนอื่นคุณต้องส่งชุดข้อมูล mtcars ไปที่ ggplot
- ภายในอาร์กิวเมนต์ aes() คุณต้องเพิ่มแกน x และแกน y
- เครื่องหมาย + หมายถึงคุณต้องการให้ R อ่านโค้ดต่อไป ซึ่งจะทำให้โค้ดอ่านง่ายขึ้นโดยการทำลายโค้ด
- ใช้ geom_point() สำหรับวัตถุทางเรขาคณิต
Output:
พล็อตกระจายกับกลุ่ม
บางครั้ง การแยกแยะค่าตามกลุ่มข้อมูล (เช่น ข้อมูลระดับปัจจัย) อาจเป็นเรื่องที่น่าสนใจ
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
คำอธิบายรหัส
- aes() ภายใน geom_point() ควบคุมสีของกลุ่ม กลุ่มควรเป็นตัวแปรปัจจัย ดังนั้นคุณจึงแปลงเกียร์แปรผันให้เป็นแฟคเตอร์
- โดยรวมแล้ว คุณมีโค้ด aes(color = factor(gear)) ที่เปลี่ยนสีของจุด
Output:
เปลี่ยนแกน
การปรับขนาดข้อมูลเป็นส่วนสำคัญของงานนักวิทยาศาสตร์ข้อมูล ข้อมูลมาในรูปแบบระฆังที่สวยงามในโอกาสที่หายาก ทางออกหนึ่งในการทำให้ข้อมูลของคุณมีความอ่อนไหวต่อค่าผิดปกติน้อยลงก็คือการปรับขนาดใหม่
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
คำอธิบายรหัส
- คุณแปลงตัวแปร x และ y ใน log() โดยตรงภายในการแมป aes()
โปรดทราบว่าการเปลี่ยนแปลงอื่นๆ สามารถนำไปใช้ได้ เช่น การทำให้เป็นมาตรฐานหรือการทำให้เป็นมาตรฐาน
Output:
แผนภูมิกระจายที่มีค่าพอดี
คุณสามารถเพิ่มข้อมูลอีกระดับลงในกราฟได้ คุณสามารถพล็อตค่าที่ติดตั้งของการถดถอยเชิงเส้นได้
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
คำอธิบายรหัส
- กราฟ: คุณเก็บกราฟของคุณไว้ในตัวแปรกราฟ ซึ่งมีประโยชน์ในการใช้งานในภายหลังหรือหลีกเลี่ยงโค้ดที่ซับซ้อนเกินไป
- อาร์กิวเมนต์ stat_smooth() ควบคุมวิธีการปรับให้เรียบ
- method = “lm”: การถดถอยเชิงเส้น
- col = “#C42126”: รหัสสำหรับเส้นสีแดง
- se = FALSE: อย่าแสดงข้อผิดพลาดมาตรฐาน
- ขนาด = 1: ขนาดของเส้นคือ 1
Output:
โปรดทราบว่ามีวิธีการปรับให้เรียบอื่นๆ ให้เลือก
- กล
- เกม
- สูญเสีย: ค่าเริ่มต้น
- ขอบ
เพิ่มข้อมูลลงในกราฟ
จนถึงตอนนี้ เรายังไม่ได้เพิ่มข้อมูลลงในกราฟ กราฟต้องให้ข้อมูล ผู้อ่านควรเห็นเรื่องราวเบื้องหลังการวิเคราะห์ข้อมูลเพียงแค่ดูกราฟโดยไม่ต้องดูเอกสารเพิ่มเติม ดังนั้นกราฟจึงต้องมีป้ายกำกับที่ดี คุณสามารถเพิ่มป้ายกำกับได้ด้วยฟังก์ชัน labs()
ไวยากรณ์พื้นฐานสำหรับ lab() คือ:
lab(title = "Hello Guru99") argument: - title: Control the title. It is possible to change or add title with: - subtitle: Add subtitle below title - caption: Add caption below the graph - x: rename x-axis - y: rename y-axis Example:lab(title = "Hello Guru99", subtitle = "My first plot")
เพิ่มชื่อ
ข้อมูลที่จำเป็นอย่างหนึ่งที่ต้องเพิ่มคือชื่ออย่างชัดเจน
my_graph + labs( title = "Plot Mile per hours and drat, in log" )
คำอธิบายรหัส
- my_graph: คุณใช้กราฟที่คุณเก็บไว้ หลีกเลี่ยงการเขียนโค้ดทั้งหมดใหม่ทุกครั้งที่คุณเพิ่มข้อมูลใหม่ลงในกราฟ
- คุณใส่ชื่อไว้ภายใน lab()
- รหัสสีแดงของเส้น
- se = FALSE: อย่าแสดงข้อผิดพลาดมาตรฐาน
- ขนาด = 1: ขนาดของเส้นคือ 1
Output:
เพิ่มชื่อเรื่องด้วยชื่อแบบไดนามิก
ชื่อแบบไดนามิกมีประโยชน์ในการเพิ่มข้อมูลที่แม่นยำยิ่งขึ้นในชื่อ
คุณสามารถใช้ฟังก์ชัน paste() เพื่อพิมพ์ข้อความคงที่และข้อความไดนามิก ไวยากรณ์พื้นฐานของ 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)
Output:
## [1] "The first year is 2010"
B <-2018 paste("The first year is", A, "and the last year is", B)
Output:
## [1] "The first year is 2010 and the last year is 2018"
คุณสามารถเพิ่มชื่อไดนามิกลงในกราฟของเราได้ ซึ่งก็คือค่าเฉลี่ยของ mpg
mean_mpg <- mean(mtcars$mpg) my_graph + labs( title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg) )
คำอธิบายรหัส
- คุณสร้างค่าเฉลี่ยของ mpg โดยมีค่าเฉลี่ย (mtcars$mpg) เก็บไว้ในตัวแปรmean_mpg
- คุณใช้ paste() กับ mean_mpg เพื่อสร้างชื่อแบบไดนามิกที่ส่งคืนค่าเฉลี่ยของ mpg
Output:
เพิ่มคำบรรยาย
รายละเอียดเพิ่มเติมสองรายการสามารถทำให้กราฟของคุณชัดเจนยิ่งขึ้น คุณกำลังพูดถึงคำบรรยายและคำบรรยายภาพ คำบรรยายจะอยู่ด้านล่างชื่อเรื่อง คำบรรยายสามารถแจ้งได้ว่าใครเป็นผู้คำนวณและแหล่งที่มาของข้อมูล
my_graph + labs( title = "Relation between Mile per hours and drat", subtitle = "Relationship break down by gear class", caption = "Authors own computation" )
คำอธิบายรหัส
- ภายใน lab() คุณเพิ่ม:
- title = “ความสัมพันธ์ระหว่างไมล์ต่อชั่วโมงและปริมาณน้ำฝน”: เพิ่มชื่อเรื่อง
- subtitle = “ความสัมพันธ์แบ่งตามคลาสเกียร์”: เพิ่มคำบรรยาย
- Caption = “ผู้แต่งคำนวณเอง: เพิ่มคำบรรยายภาพ
- คุณแยกข้อมูลใหม่แต่ละรายการด้วยเครื่องหมายจุลภาค ,
- โปรดทราบว่าคุณทำลายบรรทัดของโค้ด มันไม่ได้บังคับ แต่ช่วยให้อ่านโค้ดได้ง่ายขึ้นเท่านั้น
Output:
เปลี่ยนชื่อแกน x และแกน y
ตัวแปรในชุดข้อมูลอาจไม่ชัดเจนเสมอไป หรือตามธรรมเนียมแล้วจะใช้ _ เมื่อมีคำหลายคำ (เช่น 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" )
คำอธิบายรหัส
- ภายใน lab() คุณเพิ่ม:
- x = “คำจำกัดความ Drat”: เปลี่ยนชื่อแกน x
- y = “ไมล์ต่อชั่วโมง”: เปลี่ยนชื่อแกน y
Output:
ควบคุมตาชั่ง
คุณสามารถควบคุมขนาดของแกนได้
ฟังก์ชัน 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 ด้วยขั้นตอน 3 คุณจะมีตัวเลขสี่ตัวคือ 0 4 8 12
seq(0, 12,4)
Output:
## [1] 0 4 8 12
คุณสามารถควบคุมขนาดของแกน x และแกน y ได้ดังต่อไปนี้
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" )
คำอธิบายรหัส
- ฟังก์ชัน scale_y_continuous() ควบคุม แกน y
- ฟังก์ชัน scale_x_continuous() ควบคุม แกน x.
- ตัวแบ่งพารามิเตอร์จะควบคุมการแยกแกน คุณสามารถเพิ่มลำดับของตัวเลขด้วยตนเองหรือใช้ฟังก์ชัน seq():
- seq(1, 3.6, by = 0.2) สร้างตัวเลข 2.4 ตัวจาก 3.4 ถึง 3 ด้วยขั้นตอน XNUMX
- seq(1, 1.6, by = 0.1) สร้างตัวเลขเจ็ดตัวจาก 1 ถึง 1.6 โดยเพิ่มทีละ 1
Output:
กระทู้
สุดท้าย R ช่วยให้เราปรับแต่งโครงเรื่องด้วยธีมที่แตกต่างกันได้ ไลบรารี ggplot2 มีแปดธีม:
- theme_bw()
- ธีม_ไลท์()
- theme_classis()
- theme_linedraw()
- theme_dark()
- theme_minimal()
- theme_gray()
- ธีม_โมฆะ()
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" )
Output:
บันทึกแปลง
หลังจากขั้นตอนทั้งหมดนี้ ก็ถึงเวลาบันทึกและแชร์กราฟของคุณ คุณเพิ่ม ggsave('NAME OF THE FILE) ทันทีหลังจากที่คุณพล็อตกราฟ และมันจะถูกจัดเก็บไว้ในฮาร์ดไดรฟ์
กราฟจะถูกบันทึกไว้ในไดเร็กทอรีการทำงาน หากต้องการตรวจสอบไดเร็กทอรีการทำงาน คุณสามารถรันโค้ดนี้ได้:
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" )
Output:
ggsave("my_fantastic_plot.png")
Output:
## 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)
สรุป
คุณสามารถสรุปข้อโต้แย้งเพื่อสร้างแผนภูมิแบบกระจายในตารางด้านล่างนี้ได้:
วัตถุประสงค์ | รหัส |
---|---|
พล็อตกระจายพื้นฐาน |
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("Hello Guru99")) |
เพิ่มคำบรรยาย |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99")) |
เปลี่ยนชื่อ x |
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("my_fantastic_plot.png") |