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:

เปลี่ยนชื่อแกน 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 ด้วยขั้นตอน 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")