การสร้างแผนภาพกระจายจุดใน R โดยใช้ ggplot2 พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
การสร้างแผนภาพกระจายใน R โดยใช้ ggplot2 จะกำหนดตัวแปรต่อเนื่องสองตัวให้กับแกน x และ y โดยใช้ geom_point() บทแนะนำนี้จะครอบคลุมกลุ่ม...ping โดยใช้สี การแปลงลอการิทึม เส้นถดถอยที่เหมาะสม ป้ายกำกับ การแบ่งกลุ่ม การแก้ไขการซ้อนทับ มาตราส่วน ธีม และการบันทึก

เหตุใดกราฟจึงมีความสำคัญในการวิเคราะห์ข้อมูล
กราฟเป็นส่วนที่สามของกระบวนการวิเคราะห์ข้อมูล ภาคแรกเป็นเรื่องเกี่ยวกับ ข้อมูล extracการส่วนที่สองเกี่ยวข้องกับ ทำความสะอาดและจัดการข้อมูล- ในที่สุด Data Scientist ก็อาจจำเป็นต้องทำ สื่อสารผลลัพธ์ของเขาแบบกราฟิก.
ภาพด้านล่างสรุปขั้นตอนการทำงานของนักวิทยาศาสตร์ข้อมูล
- งานแรกของนักวิทยาศาสตร์ข้อมูลคือการกำหนดคำถามการวิจัย คำถามวิจัยนี้ขึ้นอยู่กับวัตถุประสงค์และเป้าหมายของโครงการ
- หลังจากนั้นงานที่โดดเด่นที่สุดอย่างหนึ่งก็คือวิศวกรรมฟีเจอร์ นักวิทยาศาสตร์ข้อมูลจำเป็นต้องรวบรวม จัดการ และทำความสะอาดข้อมูล
- เมื่อขั้นตอนนี้เสร็จสิ้น เขาสามารถเริ่มสำรวจชุดข้อมูลได้ บางครั้งจำเป็นต้องปรับปรุงและเปลี่ยนแปลงสมมติฐานเดิมเนื่องจากการค้นพบครั้งใหม่
- เมื่อราคาของ อธิบาย การวิเคราะห์ข้อมูลทำได้สำเร็จแล้ว Data Scientist จะต้องคำนึงถึงความสามารถของผู้อ่านด้วย เข้าใจแนวคิดและโมเดลพื้นฐาน.
- ผลลัพธ์ของเขาควรนำเสนอในรูปแบบที่ผู้มีส่วนได้ส่วนเสียทุกคนสามารถเข้าใจได้ หนึ่งในวิธีที่ดีที่สุดในการ สื่อสาร ผลลัพธ์คือผ่าน กราฟ.
- กราฟเป็นเครื่องมือที่น่าทึ่งในการทำให้การวิเคราะห์ที่ซับซ้อนง่ายขึ้น
ส่วนที่เหลือของบทช่วยสอนนี้จะสร้างกราฟเหล่านั้นโดยใช้แพ็กเกจ ggplot2
แพ็คเกจ ggplot2
บทช่วยสอนนี้เน้นการสร้างแผนภูมิใน R โดยใช้ ggplot2
ในบทเรียนนี้ คุณจะใช้แพ็กเกจ ggplot2 แพ็กเกจนี้ใช้หลักไวยากรณ์ของกราฟิก (Grammar of Graphics) ที่ Leland Wilkinson อธิบายไว้ในปี 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 คุณเริ่มต้นด้วยการวางแผน Scatterplot ของตัวแปร mpg และตัวแปร drat
พล็อตกระจายพื้นฐาน
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
Code คำอธิบาย
- ก่อนอื่นคุณต้องส่งชุดข้อมูล mtcars ไปที่ ggplot
- ภายในอาร์กิวเมนต์ aes() คุณต้องเพิ่มแกน x และแกน y
- เครื่องหมาย + หมายถึงคุณต้องการให้ R อ่านโค้ดต่อไป ซึ่งจะทำให้โค้ดอ่านง่ายขึ้นโดยการทำลายโค้ด
- ใช้ geom_point() สำหรับวัตถุทางเรขาคณิต
Output:
พล็อตกระจายกับกลุ่ม
บางครั้ง การแยกแยะค่าตามกลุ่มข้อมูล (เช่น ข้อมูลระดับปัจจัย) อาจเป็นเรื่องที่น่าสนใจ
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
Code คำอธิบาย
- ฟังก์ชัน aes() ภายใน geom_point() ควบคุมสีของแต่ละกลุ่มping ตัวแปรต้องเป็นแฟกเตอร์ ดังนั้นเกียร์จึงถูกห่อด้วยแฟกเตอร์()
- โดยรวมแล้ว คุณมีโค้ด aes(color = factor(gear)) ที่เปลี่ยนสีของจุด
Output:
เปลี่ยนมาตราส่วนแกนด้วยการแปลงลอการิทึม
การปรับขนาดข้อมูลเป็นส่วนสำคัญของงานนักวิเคราะห์ เนื่องจากตัวแปรดิบมักไม่ปรากฏในรูปทรงระฆังที่เรียบร้อย การใช้ลอการิทึมเป็นวิธีหนึ่งในการบีบอัดค่าที่ผิดปกติและทำให้กราฟมีความไวต่อค่าผิดปกติลดลง
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
Code คำอธิบาย
- คุณแปลงค่าตัวแปร x และ y ใน log() โดยตรงภายใน map ของ aes()ping.
โปรดทราบว่าการเปลี่ยนแปลงอื่นๆ สามารถนำไปใช้ได้ เช่น การทำให้เป็นมาตรฐานหรือการทำให้เป็นมาตรฐาน
Output:
แผนภูมิกระจายที่มีค่าพอดี
คุณสามารถเพิ่มข้อมูลอีกระดับหนึ่งลงในกราฟได้ คุณสามารถซ้อนทับค่าที่คาดการณ์ไว้ของ a ลงไปได้ การถดถอยเชิงเส้น.
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() ควบคุมวิธีการปรับให้เรียบ
- method = “lm”: การถดถอยเชิงเส้น
- คอลัมน์ = “#C42126”: Code สำหรับเส้นสีแดง
- se = FALSE: อย่าแสดงข้อผิดพลาดมาตรฐาน
- size = 1: ความหนาของเส้น ใน ggplot2 เวอร์ชัน 3.4.0 และเวอร์ชันที่ใหม่กว่านั้น อาร์กิวเมนต์นี้ถูกเปลี่ยนชื่อเป็น linewidth สำหรับรูปทรงเรขาคณิตของเส้น
Output:
โปรดทราบว่ามีวิธีการปรับให้เรียบอื่นๆ ให้เลือก
- กล
- เกม
- ดินเลส: ค่าเริ่มต้นสำหรับข้อมูลน้อยกว่า 1,000 รายการ
- rlm: แบบจำลองเชิงเส้นที่แข็งแกร่ง (robust linear model) จากแพ็กเกจ MASS
ก่อนที่จะตกแต่งแผนภูมิ เราควรทราบก่อนว่าเมื่อใดจึงเหมาะสมที่จะใช้แผนภูมิกระจายจุด
แผนภูมิกระจายเทียบกับแผนภูมิเส้นเทียบกับ Bubblแผนภูมิ e ใน R
ทั้งสามแบบแสดงความสัมพันธ์ระหว่างตัวแปรต่อเนื่องสองตัว ดังนั้นการเลือกจึงขึ้นอยู่กับว่าผู้อ่านควรได้รับอะไรจากแบบกราฟนี้
| หลักเกณฑ์ | พล็อตกระจาย | แผนภูมิเส้น | Bubble แผนภูมิ |
|---|---|---|---|
| แสดงให้เห็นว่า | ความสัมพันธ์ระหว่างตัวแปรสองตัว | การเปลี่ยนแปลงของตัวแปรหนึ่งตัวตามแกนที่เรียงลำดับ | ความสัมพันธ์บวกกับขนาดที่สาม |
| แกน X | ตัวแปรต่อเนื่องใดๆ | โดยปกติแล้วจะเป็นช่วงเวลาหรือมาตราส่วนลำดับอื่น ๆ | ตัวแปรต่อเนื่องใดๆ |
| ลำดับคะแนน | ที่ไม่เกี่ยวข้อง | จุดสำคัญต่างๆ เชื่อมโยงกัน | ที่ไม่เกี่ยวข้อง |
| ตัวแปรที่สาม | ผ่านทางสีหรือรูปทรง | ผ่านสายแยกกัน | ขนาดจุดผ่าน |
| เรียกใช้ ggplot2 | geom_point() | geom_line() | geom_point(aes(size = z)) |
การเชื่อมจุดกระจายด้วยเส้นตรงเมื่อแกน x ไม่มีลำดับตามธรรมชาติเป็นความผิดพลาดที่พบบ่อย: มันบ่งบอกถึงลำดับที่ไม่มีอยู่จริง ควรใช้ 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()
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) )
Code คำอธิบาย
- คุณสร้างค่าเฉลี่ยของ 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"
)
Code คำอธิบาย
- ภายใน labs() คุณได้เพิ่ม:
- 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"
)
Code คำอธิบาย
- ภายใน labs() คุณได้เพิ่ม:
- 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 โดยมีช่วงห่าง 4 จะได้ผลลัพธ์เป็นตัวเลขสี่ตัว ได้แก่ 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"
)
Code คำอธิบาย
- ฟังก์ชัน scale_y_continuous() ควบคุม แกน y
- ฟังก์ชัน scale_x_continuous() ควบคุม แกน x.
- ตัวแบ่งพารามิเตอร์จะควบคุมการแยกแกน คุณสามารถเพิ่มลำดับของตัวเลขด้วยตนเองหรือใช้ฟังก์ชัน 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
Output:
กระทู้
สุดท้ายนี้ ggplot2 ช่วยให้คุณปรับแต่งรูปทรงของกราฟทั้งหมดได้ด้วยฟังก์ชันธีมเพียงฟังก์ชันเดียว โดยมีธีมสำเร็จรูปให้เลือกใช้ถึงแปดแบบในแพ็กเกจ:
- theme_bw()
- ธีม_ไลท์()
- ธีม_คลาสสิก()
- 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.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"
)
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)
วิธีสร้างแผนภูมิกระจายแบบหลายมิติใน R โดยใช้ facet_wrap()
การแบ่งกลุ่มข้อมูล (Faceting) เป็นหนึ่งในแปดส่วนประกอบของ ggplot2 ที่กล่าวถึงไปก่อนหน้านี้ และเป็นวิธีที่สะอาดที่สุดสำหรับการสร้างกราฟที่มีข้อมูลหนาแน่น แทนที่จะบีบทุกกลุ่มลงในแผงเดียว ggplot2 จะวาดแผงเล็กๆ หลายแผงสำหรับแต่ละระดับของตัวแปร โดยใช้มาตราส่วนเดียวกันทั้งหมด เพื่อให้แผงต่างๆ สามารถเปรียบเทียบกันได้
# One panel per gear count ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() + facet_wrap(~ gear) + theme_classic()
เหตุผลหลักสามข้อนี้ทำหน้าที่ได้อย่างสมบูรณ์แล้ว
- น or แคบ: บังคับให้แผงต่างๆ อยู่ในรูปแบบที่กำหนด เช่น facet_wrap(~ gear, ncol = 2)
- ตาชั่ง: ค่าเริ่มต้นคือ “fixed” เพื่อให้ทุกแผงใช้ช่วงแกนเดียวกัน ใช้ “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()
เหลี่ยมมุมหรือสี? การใช้สีเหมาะสมกับการจัดกลุ่มข้อมูลบนแผนภูมิได้ไม่เกินสี่กลุ่ม โดยมีการทับซ้อนกันน้อย หากมากกว่านั้น หรือกลุ่มข้อมูลทับซ้อนกันมาก การใช้การแบ่งกลุ่มย่อย (faceting) จะอ่านง่ายกว่า เพราะแต่ละแผงจะมีเฉพาะจุดข้อมูลของตัวเองเท่านั้น คุณสามารถผสมผสานทั้งสองวิธีได้ คือ การแบ่งกลุ่มย่อยด้วยตัวแปรหนึ่ง และใช้สีด้วยอีกตัวแปรหนึ่ง ดังตัวอย่าง 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()
โดยทั่วไปแล้ว ฟังก์ชัน alpha จะจัดการกับจุดข้อมูลจำนวนไม่กี่พันจุด การแบ่งกลุ่มแบบหกเหลี่ยมจะจัดการกับจุดข้อมูลหลายหมื่นจุด และการสุ่มตัวอย่างข้อมูลด้วย 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")) |
| เปลี่ยนชื่อ 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() |
| แบ่งกลุ่มตามลักษณะเฉพาะ |
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")
|












