การสร้างแผนภาพกระจายจุดใน R โดยใช้ ggplot2 พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 📍 ไวยากรณ์พื้นฐาน: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() สร้างกราฟจากข้อมูลและแผนที่pingและเรขาคณิต
  • 🎨 กิจกรรมระบายสีกลุ่ม: aes(color = factor(gear)) ภายใน geom_point() จะแบ่งจุดออกเป็นสีเดียวต่อระดับปัจจัย
  • 📈 เส้นแนวโน้ม: stat_smooth(method = “lm”) จะซ้อนทับเส้นถดถอยที่ปรับให้เหมาะสม และ se = FALSE จะลบแถบความเชื่อมั่นออก
  • 🗂️ การแบ่งเหลี่ยม: facet_wrap() จะวาดแผงหนึ่งแผงต่อกลุ่มบนมาตราส่วนเดียวกัน ซึ่งดีกว่าการรวมทุกชุดข้อมูลไว้ในแผนภูมิเดียว
  • 🔁 การวางแผนมากเกินไป: ลดค่าอัลฟ่า กระจายจุด หรือเปลี่ยนไปใช้ geom_hex() เมื่อเครื่องหมายซ้อนทับกัน
  • 💾 ส่งออก: ggsave(“plot.png”, width = 8, height = 5, dpi = 300) จะบันทึกภาพพล็อตล่าสุดลงในไดเร็กทอรีทำงาน

การสร้างแผนภาพกระจายจุดใน R โดยใช้ ggplot2

เหตุใดกราฟจึงมีความสำคัญในการวิเคราะห์ข้อมูล

กราฟเป็นส่วนที่สามของกระบวนการวิเคราะห์ข้อมูล ภาคแรกเป็นเรื่องเกี่ยวกับ ข้อมูล 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:

เปลี่ยนชื่อแกน x และแกน y

ควบคุมตาชั่ง

คุณสามารถควบคุมขนาดของแกนได้

ฟังก์ชัน 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")

คำถามที่พบบ่อย

ฟังก์ชัน geom_point() จะวาดจุดสังเกตแต่ละจุด ณ พิกัดที่แน่นอน ส่วนฟังก์ชัน geom_jitter() จะเพิ่มการเคลื่อนที่แบบสุ่มเล็กน้อย เพื่อให้จุดที่มีค่าเดียวกันสามารถแยกแยะได้ ซึ่งมีความสำคัญเมื่อแกนหนึ่งมีค่าที่ไม่ต่อเนื่อง

ภายในฟังก์ชัน aes() สีจะกำหนดค่าให้กับตัวแปร ดังนั้น ggplot2 จะกำหนดเฉดสีหนึ่งเฉดต่อระดับและสร้างคำอธิบายภาพ ส่วนภายนอกฟังก์ชัน aes() สีจะเป็นค่าคงที่ที่ใช้กับทุกจุด และจะไม่มีคำอธิบายภาพปรากฏขึ้น

เพิ่ม stat_smooth(method = “lm”) หรือ geom_smooth(method = “lm”) หลัง geom_point() ตั้งค่า se = FALSE เพื่อซ่อนแถบความเชื่อมั่น และใช้ method = “loess” สำหรับตัวปรับเรียบแบบไม่เชิงเส้น

แผนภาพกระจายจุดแสดงความสัมพันธ์ของคุณลักษณะและค่าผิดปกติก่อนการฝึกฝน และเป็นวิธีการมาตรฐานในการแสดงค่าที่ทำนายเทียบกับค่าจริง หรือเพื่อแสดงภาพคลัสเตอร์หลังจากการลดมิติด้วย PCA หรือ t-SNE

ใช่แล้ว ผู้ช่วย AI สามารถร่างเลเยอร์ แนะนำวิธีแก้ไขปัญหาการซ้อนทับของพล็อต และอธิบายข้อผิดพลาดต่างๆ เช่น การขาดตัวห่อ aes() ลองรันโค้ดที่สร้างขึ้นกับข้อมูลของคุณเอง เพราะชื่อคอลัมน์และประเภทแฟกเตอร์นั้นอาจเขียนผิดได้ง่าย

สรุปโพสต์นี้ด้วย: