7  การสร้างภาพนิทัศน์ด้วยชุดคำสั่งฐาน (Based Plot)

ก่อนเริ่มเนื้อหาในบทที่ 7 ผู้อ่านจำเป็นต้องทราบการกำหนดกลุ่มคำสั่ง (code chunk) ที่สำคัญก่อนเพื่อที่จะได้ผลลัพธ์ของเอกสาร หรือรายงานที่สมบูรณ์

เช่น ต้องการภาพ ยาว 7 สูง 4 และมีไฟล์ภาพเป็น png ในเอกที่เป็น word หรือ pdf ทำได้โดย

 ```{r, fig.width=7, fig.height=4, dev='png'}
 plot(x =cars$speed, y =cars$dist)

7.1 สีในอาร์ (Colors in R)

การเลือกใช้สีเพื่อวาดกราฟด้วยภาษาอาร์นั้น สามารถใส่ชื่อสีเป็นภาษาอังกฤษที่ทราบชื่อ ได้ทั้งหมด 667 สีด้วยคำสั่ง colors( )

colors( )

โดยคำสั่งนี้จะแสดงรายชื่อสีทั้งหมดออกแบบมาเป็นเวคเตอร์ชื่อสีทั้งหมด 667 สีสามารถดูจากได้รูปที่ 7.1

สีและชื่อสีทั้งหมด 657 สี

สมมุติมีสีที่ต้องการใช้งาน 5 สี คือสีหมายเลข 2, 200, 400, 600, 20 ตามลำดับดังนั้น การเรียกใช้ค่าสีที่ต้องการทำได้โดยให้สร้างเวคเตอร์ เพื่อเก็บชื่อสีขึ้นมาดังนี้

Color.vec <- colors( )[c(2, 200, 400, 600, 20)]
Color.vec
[1] "aliceblue"  "gray47"     "lightblue1" "slategray1" "bisque1"   

ในกรณีของสีแบบอื่นๆ ที่ไม่มีชื่อ จะถูกเก็บไว้ในรูปแบบของเลขฐาน 16 จำนวน 6 หลัก โดยทุกสองหลัก จะเป็นเลข 00 ถึง 99 และอักษรภาษาอังกฤษจากอักษร A ถึง F หรือ a ถึง f ก็ได้ในแต่ละหลัก การเรียกใช้งานสีเหล่านี้ในอาร์ทำได้ ดังตัวอย่างนี้

c("#000000","#AA0000","#FFFFFF","#C71585","#00FFFF", "#FF00FF","green")

สำหรับโปรแกรม RStudio รุ่นใหม่ตั้งแต่ต้นปี 2023 เป็นต้นไปสามารถ แสดงตัวอย่างสีให้เห็นทางหน้าจอได้ เมื่อพิมพ์ชื่อสีภาษาอังกฤษ หรือ hex color ภายใต้เครื่องคำพูด ดังตัวอย่างในรูปที่ 7.2

ตัวอย่างชื่อสีใน RStudio

เวบไซต์แนะนำสำหรับการเลือกใช้สี

https://www.color-hex.com

https://htmlcolorcodes.com

https://imagecolorpicker.com

7.1.1 รายชื่อจานสีในอาร์ (The list of color palettes in R)

สำหรับภาษาอาร์ เราสามารถแบ่งสีประเภทต่างออกเป็นชื่อของจานสี ซึ่งมีทั้งหมดคือ 115 จานสี

hcl.pals( )
  [1] "Pastel 1"      "Dark 2"        "Dark 3"        "Set 2"        
  [5] "Set 3"         "Warm"          "Cold"          "Harmonic"     
  [9] "Dynamic"       "Grays"         "Light Grays"   "Blues 2"      
 [13] "Blues 3"       "Purples 2"     "Purples 3"     "Reds 2"       
 [17] "Reds 3"        "Greens 2"      "Greens 3"      "Oslo"         
 [21] "Purple-Blue"   "Red-Purple"    "Red-Blue"      "Purple-Orange"
 [25] "Purple-Yellow" "Blue-Yellow"   "Green-Yellow"  "Red-Yellow"   
 [29] "Heat"          "Heat 2"        "Terrain"       "Terrain 2"    
 [33] "Viridis"       "Plasma"        "Inferno"       "Rocket"       
 [37] "Mako"          "Dark Mint"     "Mint"          "BluGrn"       
 [41] "Teal"          "TealGrn"       "Emrld"         "BluYl"        
 [45] "ag_GrnYl"      "Peach"         "PinkYl"        "Burg"         
 [49] "BurgYl"        "RedOr"         "OrYel"         "Purp"         
 [53] "PurpOr"        "Sunset"        "Magenta"       "SunsetDark"   
 [57] "ag_Sunset"     "BrwnYl"        "YlOrRd"        "YlOrBr"       
 [61] "OrRd"          "Oranges"       "YlGn"          "YlGnBu"       
 [65] "Reds"          "RdPu"          "PuRd"          "Purples"      
 [69] "PuBuGn"        "PuBu"          "Greens"        "BuGn"         
 [73] "GnBu"          "BuPu"          "Blues"         "Lajolla"      
 [77] "Turku"         "Hawaii"        "Batlow"        "Blue-Red"     
 [81] "Blue-Red 2"    "Blue-Red 3"    "Red-Green"     "Purple-Green" 
 [85] "Purple-Brown"  "Green-Brown"   "Blue-Yellow 2" "Blue-Yellow 3"
 [89] "Green-Orange"  "Cyan-Magenta"  "Tropic"        "Broc"         
 [93] "Cork"          "Vik"           "Berlin"        "Lisbon"       
 [97] "Tofino"        "ArmyRose"      "Earth"         "Fall"         
[101] "Geyser"        "TealRose"      "Temps"         "PuOr"         
[105] "RdBu"          "RdGy"          "PiYG"          "PRGn"         
[109] "BrBG"          "RdYlBu"        "RdYlGn"        "Spectral"     
[113] "Zissou 1"      "Cividis"       "Roma"         

โดยในแต่ละจานสีอาจจะมีจำนวนสีไม่เท่ากัน

และสามารถแบ่งจานสีออกมาได้เป็น 4 กลุ่มใหญ่ คือ

  1. qualitative
hcl.pals( type = "qualitative")
[1] "Pastel 1" "Dark 2"   "Dark 3"   "Set 2"    "Set 3"    "Warm"     "Cold"    
[8] "Harmonic" "Dynamic" 
  1. sequential
hcl.pals( type = "sequential")
 [1] "Grays"         "Light Grays"   "Blues 2"       "Blues 3"      
 [5] "Purples 2"     "Purples 3"     "Reds 2"        "Reds 3"       
 [9] "Greens 2"      "Greens 3"      "Oslo"          "Purple-Blue"  
[13] "Red-Purple"    "Red-Blue"      "Purple-Orange" "Purple-Yellow"
[17] "Blue-Yellow"   "Green-Yellow"  "Red-Yellow"    "Heat"         
[21] "Heat 2"        "Terrain"       "Terrain 2"     "Viridis"      
[25] "Plasma"        "Inferno"       "Rocket"        "Mako"         
[29] "Dark Mint"     "Mint"          "BluGrn"        "Teal"         
[33] "TealGrn"       "Emrld"         "BluYl"         "ag_GrnYl"     
[37] "Peach"         "PinkYl"        "Burg"          "BurgYl"       
[41] "RedOr"         "OrYel"         "Purp"          "PurpOr"       
[45] "Sunset"        "Magenta"       "SunsetDark"    "ag_Sunset"    
[49] "BrwnYl"        "YlOrRd"        "YlOrBr"        "OrRd"         
[53] "Oranges"       "YlGn"          "YlGnBu"        "Reds"         
[57] "RdPu"          "PuRd"          "Purples"       "PuBuGn"       
[61] "PuBu"          "Greens"        "BuGn"          "GnBu"         
[65] "BuPu"          "Blues"         "Lajolla"       "Turku"        
[69] "Hawaii"        "Batlow"       
  1. diverging
hcl.pals( type = "diverging")
 [1] "Blue-Red"      "Blue-Red 2"    "Blue-Red 3"    "Red-Green"    
 [5] "Purple-Green"  "Purple-Brown"  "Green-Brown"   "Blue-Yellow 2"
 [9] "Blue-Yellow 3" "Green-Orange"  "Cyan-Magenta"  "Tropic"       
[13] "Broc"          "Cork"          "Vik"           "Berlin"       
[17] "Lisbon"        "Tofino"       
  1. divergingx
hcl.pals( type = "divergingx")
 [1] "ArmyRose" "Earth"    "Fall"     "Geyser"   "TealRose" "Temps"   
 [7] "PuOr"     "RdBu"     "RdGy"     "PiYG"     "PRGn"     "BrBG"    
[13] "RdYlBu"   "RdYlGn"   "Spectral" "Zissou 1" "Cividis"  "Roma"    

7.1.2 คำสั่ง hcl.colors( )

เป็นการแสดงสีในจานสีที่เลือก ตามจำนวนสีที่ต้องการโดย

hcl.colors(n = เลขจำนวนเต็มที่ต้องการ, palette = "ชื่อจานสีจาก 115 จาน")

เช่น

hcl.colors(n = 5, palette = "Lisbon")
[1] "#E2FCFF" "#65829D" "#181818" "#828156" "#FCFCD3"
hcl.colors(n = 8, palette = "Lisbon")
[1] "#E2FCFF" "#8CB6DD" "#587189" "#2A333C" "#333325" "#71704C" "#B6B577"
[8] "#FCFCD3"

ถ้าต้องการเห็นสีที่เลือกใช้ สามารถใช้คำสั่ง show_col( ) จากชุดคำสั่ง scales ด้วยคำสั่ง show_col( )

library(scales)
COL <- hcl.colors(n = 6, palette = "Lisbon")
show_col(COL)

หรือใช้คำสั่ง pie( )

pie(x = rep(1,5),  # เวคเตอร์ตัวเลขอะไรก็ได้ที่มีจำนวนสมาชิกเท่ากับจำนวนสี
    col = COL,     #แสดงสีเวคเตอร์สี
    labels = COL)  # ชื่อของสีในรูปแบบ hex

7.1.3 ชุดคำสั่ง RColorBrewer

ก็จะรายชื่อจานสีของชุดคำสั่ง RcolorBrewer

library("RColorBrewer")
display.brewer.all( )

ตารางสีของชุดคำสั่ง RColorBrewer

7.1.4 คำสั่ง display.brewer.pal( ) และ brewer.pal( )

การเลือกสีไปใช้ ให้ดูชุดจานสีทางซ้าย และสีในแต่ช่อง จำนวนสีที่มีทั้งหมดของสีจานที่เลือก เช่น จานสี Accent มีสีทั้งหมด 8 สี สามารถแสดงภาพสีได้โดยคำสั่ง

display.brewer.pal(n = 8, name = "Accent")

และแสดงชื่อของเวคเตอร์จานสี Accent โดย

brewer.pal(n = 8, name = "Accent")
[1] "#7FC97F" "#BEAED4" "#FDC086" "#FFFF99" "#386CB0" "#F0027F" "#BF5B17"
[8] "#666666"

ในกรณีที่ต้องการเลือกสีที่ต้องการ ให้ใช้วิธีเลือกข้อมูลแบบเวคเตอร์ เช่น ต้องการสี ที่ 7 5 และ 1

Accent <- brewer.pal(n = 8, name = "Accent")
Accent[c(7, 5, 1)]
[1] "#BF5B17" "#386CB0" "#7FC97F"

ก็จะได้สีที่ต้องการ

7.2 เมนูเสริม (Addins)

ชุดคำสั่ง colourpicker

install.packages("colourpicker")

ติดตั้งแล้ว ไม่ต้องใช้คำสั่ง library ในการเรียกใช้งาน สามารถเรียกใช้งานได้จากเมนู Addins

ตัวอย่างหน้าต่าง Addins Colour Picker

7.3 กราฟพื้นฐานสำหรับข้อมูล 1 มิติ หรือ 1 ตัวแปร

กราฟสำหรับข้อมูล 1 มิติ

สำหรับข้อมูลที่เป็นเวคเตอร์ของข้อมูลที่เป็นตัวเลข จำนวนเต็ม
ตัวอักษร หรือตัวแปรปัจจัย (factor) สามารถสร้างกราฟได้ดังนี้

7.3.1 กราฟแท่ง (bar plot) ด้วยคำสั่ง barplot( )

Bar plot เป็นกราฟที่ใช้แสดงค่าของตัวแปรแบบไม่ต่อเนื่อง (discrete variables) โดยแสดงค่าของตัวแปรในรูปของแท่ง (bar) บนกราฟ โดยแต่ละแท่งจะแสดงค่าของตัวแปรนั้น ๆ โดยใช้ความสูงของแท่งเพื่อแสดงปริมาณหรือค่าของตัวแปร

ส่วนประกอบหลักของ bar plot ประกอบด้วย:

  • แกน x: แสดงหมวดหมู่หรือค่าของตัวแปรที่เป็นแบบไม่ต่อเนื่องที่เราต้องการวิเคราะห์

  • แกน y: แสดงค่าของตัวแปรที่เราต้องการวิเคราะห์ โดยใช้ความสูงของแท่งเพื่อแสดงปริมาณหรือค่าของตัวแปร

bar plot ช่วยให้เราสามารถแสดงและเปรียบเทียบค่าของตัวแปรแบบไม่ต่อเนื่องได้ โดยจุดสำคัญที่สังเกตใน bar plot คือ:

  • ความสูงของแท่ง: ความสูงของแท่งบนกราฟแสดงถึงปริมาณหรือค่าของตัวแปรที่เราต้องการวิเคราะห์ ค่าสูงในแท่งแสดงถึงปริมาณหรือค่าข้อมูลที่มาก ค่าต่ำในแท่งแสดงถึงปริมาณหรือค่าข้อมูลที่น้อย

  • แกน x: แสดงหมวดหมู่หรือค่าของตัวแปรที่เรากำลังวิเคราะห์ การจัดเรียงแกน x สามารถทำได้ในลักษณะแบบหมวดหมู่ (categorical) หรือแบบลำดับ (ordinal) ขึ้นอยู่กับลักษณะข้อมูล

  • ความห่างระหว่างแท่ง: ความห่างระหว่างแท่งบนกราฟช่วยให้เราเห็นความแตกต่างในค่าของตัวแปรระหว่างหมวดหมู่หรือค่าข้อมูลต่างๆ ได้ชัดเจน ความห่างมากแสดงถึงความแตกต่างที่สังเกตเห็นชัดเจน ความห่างน้อยแสดงถึงความแตกต่างที่ไม่สังเกตเห็นชัดเจน

สำหรับข้อมูลที่เป็นเวคเตอร์ของตัวอักษร สามารถสร้างกราฟแท่งได้ โดยในแต่ละแท่งหมายถึงจำสามารถสมาชิกที่มีข้อมูลกัน เช่น

  • กลุ่มตัวอย่างที่เพศ (ชายหรือหญิง)

  • ยี่ห้อรถยนต์ที่เข้ามาจอดในลานจอดรถตลอดทั้งวัน

  • ชื่อโรงเรียนที่นักศึกษาใหม่จบมา

  • ภูมิลำเนาของนักศึกษาชั้นหนึ่ง(ชื่อจังหวัด)

  • พรรคการเมืองที่ประชาชนต้องการเลือก

ตัวอย่าง เกรดในรายวิชาภาษาอาร์เบื้องต้น มีเป็นดังนี้ มีนักศึกษาจำนวน 50 คน สร้างแสดงเป็นตารางได้ดังนี้

set.seed(1)
grade <- c("F","D","C","B","A")
student.grade <- sample(x = grade, size = 50, replace = TRUE)
kable(table(student.grade))
student.grade Freq
A 8
B 9
C 8
D 13
F 12

จำเป็นต้องสร้าง ตารางด้วยคำสั่ง table( ) ก่อนเพื่อนับจำนวนนักศึกษาที่ได้เกรดต่างๆ และจึงสามารถใส่ลงไปในคำสั่ง barplot( ) ได้

barplot(height = table(student.grade))

ในกรณีนี้ถ้าต้องการเรียงลำดับเกรดจาก F ไป A ทำได้โดย

rev(table(student.grade))
student.grade
 F  D  C  B  A 
12 13  8  9  8 

จะได้

barplot(height = rev(table(student.grade)))

ขอให้ผู้อ่านศึกษาการใช้ pipe operator เพื่อให้ code ที่เขียนอ่านได้ง่ายขึ้น

student.grade |>            # จากช้อมูลส่งไป
               table( ) |>   # สร้างตารางแล้วส่งไป
                 rev( ) |>  #เรียงลำดับข้่อมูลในตารางแบบย้อนกลับแล้วส่ง
             barplot( )      # สร้าง bar plot

คำสั่งย่อยที่ควรทราบสำหรับการสร้างกราฟแท่ง
  • horiz = FALSE หรือ TRUE (หมุนแกนหรือไม่)

  • col เวคเตอร์ของสีในแต่ละแท่งจากซ้ายไปขวา มีจำนวนสีเท่ากับจำนวนแท่ง (ถ้ากำหนด 1 สี ทุกแท่งจะมีสีเดียวกัน)

  • border เวคเตอร์ของสีที่เส้นขอบในกราฟที่ต้องการ ตามจำนวนแท่งที่มี ถ้ากำหนดเพียง 1 สี ทุกแท่งจะมีเส้นขอบเป็นสีเดียวกัน

  • xlab ตั้งช่ือให้แกน x

  • ylab ตั้งช่ือให้แกน y

  • main ตั้งชื่อให้กราฟ

ตัวอย่าง

barplot(height = rev(table(student.grade)),
         horiz = TRUE,
           col = c("red", "blue", "yellow", "green", "pink"),
          main = "Bar plot of student's grade in R programming course",    
          xlab = "grade",
          ylab = "Number of student",
        border = "gray")

โดยปกติแล้ว ภาษาที่ใช้อาร์ จะต้องเป็นภาษาอังกฤษเท่านั้น ถ้าต้องการใช้ภาษาอื่นๆ จำเป็นต้องเปลี่ยนชุดแบบอักษร (font) ของภาษาที่ต้องการจะใช้คำสั่งย่อย คือ

คำสั่งย่อย

family = “ชื่อชุดแบบอักษร (font) ที่ต้องการใช้งาน”

เพิ่มเติม อีกเล็กน้อย ก็สามารถใช้ภาษาที่ต้องการได้ทันที

barplot(height = rev(table(student.grade)),
           col = c("red", "blue", "yellow", "green", "pink"),
          main = "กราฟแท่งของเกรดที่นักศึกษาได้รับจากวิชาภาษาอาร์",              
          xlab = "เกรด",
          ylab = "จำนวนนักศึกษา",
        border = "gray",
        family = "TH Sarabun New")

7.3.2 Pie chart (แผนภูมิวงกลม)

เป็นกราฟที่ใช้แสดงสัดส่วนหรือความสัมพันธ์ของกลุ่มหรือส่วนประกอบต่าง ๆ ในรูปของวงกลม โดยแสดงสัดส่วนของแต่ละส่วนเป็นอัตราส่วนของพื้นที่บนวงกลม

ส่วนประกอบหลักของ pie chart ประกอบด้วย:

  • พื้นที่วงกลม: แสดงสัดส่วนหรือความสัมพันธ์ของแต่ละส่วน โดยพื้นที่วงกลมจะแบ่งออกเป็นส่วนย่อยตามสัดส่วนที่กำหนด

  • แผนภูมิวงกลม: แสดงวงกลมที่แบ่งออกเป็นส่วนย่อยตามสัดส่วนที่กำหนด

โดยแต่ละส่วนจะมีขนาดของพื้นที่สัมพันธ์กับสัดส่วนที่แทน Pie chart ใช้สำหรับการแสดงข้อมูลที่แบ่งออกเป็นส่วนย่อยโดยสัดส่วนหรือความสัมพันธ์เป็นสิ่งสำคัญ โดยจุดสำคัญที่สังเกตใน pie chart คือ:

  • สัดส่วน: สัดส่วนของแต่ละส่วนแสดงถึงส่วนแบ่งของข้อมูล โดยสัดส่วนแสดงเป็นเปอร์เซ็นต์หรืออัตราส่วนของพื้นที่บนวงกลม

หมายเหตุ ใน pie chart สามารถเพิ่มหมายเหตุ (legend) เพื่อช่วยอธิบายส่วนย่อยแต่ละส่วน โดยแสดงรายละเอียดเพิ่มเติมเกี่ยวกับส่วนนั้น ๆ ได้

คำสั่งในอาร์คือ pie( )

ถ้าเป็นเวคเตอร์ตัวอักษร หรือ factor สามารถใช้ คำสั่ง table( ) แล้วตามด้วยคำสั่ง pie( ) ได้เลย

pie(table(student.grade))

ตัวอย่าง pipe operator

student.grade |> # จากข้อมูลส่งไป
  table( ) |>     # สร้างตารางแล้วไป
  pie( )          # สร้าง pie chart

คำสั่งภายในที่สามารถปรับแต่งได้ที่ควรรู้
  • col เวคเตอร์สีตามชิ้นพายที่มีเรียงจาก ค่าโดยคำสั่ง table( ) จากตัวแรกไปตัวสุดท้าย

  • main การตั้งชื่อกราฟ

  • radius ขนาดของวงกลม ค่ามาตราฐานคือ 0.8

  • clockwise เริ่มค่าตามเข็มนาฬิกา FALSE หรือ TRUE (ค่าเริ่มต้น FALSE)

color.vec <- seq(from = 60, to = 100, by = 10)
pie(table(student.grade), col = colors( )[color.vec],
    radius = 1, main = "Pie chart of grade", 
    clockwise = TRUE)

ในบางครั้งข้อมูลที่ได้มาอาจอยู่ในรูปลักษณะนี้

เช่น

Month Unit
January 207
February 196
March 167
April 216
May 205
June 217
July 203
August 194
September 206
October 201
November 200
December 204

จากตาราง สามารถสร้างเวคเตอร์ได้ดังนี้

Month <- month.name
Unit <- c(207, 196, 167, 216, 205, 217, 203, 194, 206, 201, 200, 204)

การทำกราฟแท่งทำได้โดย

barplot(height = Unit, names.arg = Month)

สำหรับกราฟวงกลมก็เช่นเดียว

Month <- factor(x = Month, levels = Month)
pie(x = Unit, labels = Month, radius = 1)

ปรับแต่งค่าอื่นๆ ก็สามารถทำได้โดยปกติ

7.4 กราฟแบบฮิสโทแกรม(histogram)

Histogram เป็นกราฟที่ใช้แสดงการกระจายของข้อมูลตัวเลขหรือตัวแปรที่เป็นตัวเลข โดยแบ่งช่วงค่าของข้อมูลออกเป็นกลุ่มหรือช่วงเท่าๆ กัน แล้วนับจำนวนข้อมูลที่อยู่ในแต่ละช่วง จากนั้นแสดงผลในรูปของแท่งบนกราฟ โดยแกนแนวตั้งแสดงจำนวนข้อมูลในแต่ละช่วง และแกนแนวนอนแสดงช่วงค่าของข้อมูล

ส่วนประกอบหลักของ histogram ประกอบด้วย:

  • แกน x: แสดงช่วงค่าของข้อมูลที่เรากำลังวิเคราะห์

  • แกน y: แสดงจำนวนข้อมูลในแต่ละช่วงของแกน x

Histogram ช่วยให้เราสามารถดูและวิเคราะห์รูปแบบการกระจายของข้อมูลได้ โดยจุดสำคัญที่สังเกตใน histogram คือ:

  • รูปร่าง: รูปร่างของ histogram ช่วยให้เราเห็นแนวโน้มของข้อมูลว่ากระจายมากน้อยแบบไหน หรือมีแนวโน้มการกระจายแบบไหน เช่น กราฟสูงชันแสดงถึงจำนวนข้อมูลที่มีค่าใกล้เคียงกันมาก กราฟแบนแสดงถึงจำนวนข้อมูลที่กระจายอยู่ในช่วงค่ากว้างขวาง

  • ช่วงค่า: การแบ่งช่วงค่าของข้อมูลบนแกน x ช่วยให้เราเห็นว่าข้อมูลมีการกระจายอยู่ในช่วงค่าใดมากที่สุดหรือน้อยที่สุด

  • ความถี่: ความสูงของแท่งบนแกน y แสดงถึงจำนวนข้อมูลที่อยู่ในแต่ละช่วงค่า

การอ่าน histogram ให้ดูไปที่ความสูงของแท่งบนกราฟ และช่วงค่าของแกน x ที่แท่งต่าง ๆ อยู่ ความสูงของแท่งบนกราฟแสดงถึงจำนวนข้อมูลในช่วงค่านั้น ๆ โดยสามารถใช้ histogram เพื่อวิเคราะห์และเปรียบเทียบการกระจายของข้อมูลระหว่างกลุ่มหรือชุดข้อมูลที่แตกต่างกันได้

ตัวอย่าง ข้อมูลจำลองจากการแจกแจงแบบปกติ ที่มีค่าเฉลี่ยเท่า 0 ค่าส่วนเบียงเบนมาตราฐานเท่ากับ 1 จำนวน 1 ตัวอย่าง

set.seed(15)
Normal.data <- rnorm( n = 1000 , mean = 0, sd = 1)

คำสั่งที่ใช้สร้างกราฟแบบฮิตโทแกรมคือ hist( )

hist(x = Normal.data)

ค่า Frequency ค่าความถี่ของตัวอย่างมีค่ามีช่วงความยาวที่กำหนด

คำสั่งย่อยที่ควรทราบสำหรับการสร้างกราฟฮิตโทแกรม
  • freq ตั้งค่าเท่ากับ FALSE จะเป็นกราฟแบบ PDF (probability density function)

  • col เวคเตอร์ของสีในแต่ละแท่งจากซ้ายไปขวา มีจำนวนสีเท่ากับจำนวนแท่ง (ถ้ากำหนด 1 สี ทุกแท่งจะมีสีเดียวกัน)

  • border เวคเตอร์ของสีที่เส้นขอบในกราฟที่ต้องการ ตามจำนวนแท่งที่มีนวนแท่ง ถ้ากำหนด 1 สี ทุกเส้นขอบจะมีสีเดียวกัน

  • xlab ตั้งช่ือให้แกน x

  • ylab ตั้งช่ือให้แกน y

  • xlim กำหนดช่างความแกน x โดย c(เลขตำ่สุด, เลขสูงสุด)

  • ylim กำหนดช่างความแกน y โดย c(เลขตำ่สุด, เลขสูงสุด)

  • main ตั้งชื่อให้กราฟ

hist(   x = Normal.data, freq = FALSE,
      col = "#912cee",
     main ="The histgram of simulation data from N(0,1)",
     xlim = c(-7, 7),
     ylim = c(0, .5),
     xlab = "x")

การเพิ่มกราฟฮิตโทแกรมเพิ่มลงไปอีกในกราฟเดียวกัน

ตัวอย่างถ้าเรามี ข้อมูลอีกชุดคือ

set.seed(15)
Normal.data2 <- rnorm( n = 1000 , mean = 4, sd = 2)

และต้องการเพิ่มภาพลงไปในกราฟเดิมทำได้โดย กำหนด add = TRUE ลงคำสั่ง hist( ) ที่สอง ดังนี้

hist(x = Normal.data, col = "red", xlim = c(-5, 10))
hist(x = Normal.data2, col = "blue", add = TRUE)

คำสั่ง xlim ต้องกำหนดในคำสั่ง hist( ) แรก

จะเห็นว่า ฮิตโทแกรมทั้งสอง มีบางส่วนที่ซ้อนทับกันอยู่ ทำให้ไม่ทราบรายละเอียดของกราฟแรก ดังนั้น จะต้องสีโปร่งแสง (transparent color) เพื่อให้เห็นรายละเอียดของกราฟที่ถูกบดบัง

7.4.1 สีโปรงแสงโดย (transparent color) ชุดคำสั่ง yarrr

library(yarrr)

คำสั่งที่ใช้คือ transparent( ) โดยใช้คำสั่งภายใน

  • orig.col คือ เวคเตอร์ที่ต้องการ

  • trans.val คือ เวคเตอร์ของระดับความโปร่งแสงในช่วง [0,1] โดยที่ 0 คือทึบแสง และ 1 คือใสที่สุด

Color.Tran <- transparent(orig.col = c("red","blue"),trans.val = c(.2, .5))
Warning in final.col[i] <- rgb(orig.col[1, i], orig.col[2, i], orig.col[3, :
number of items to replace is not a multiple of replacement length

Warning in final.col[i] <- rgb(orig.col[1, i], orig.col[2, i], orig.col[3, :
number of items to replace is not a multiple of replacement length
hist(x = Normal.data, col = Color.Tran[1], xlim = c(-5, 10))
hist(x = Normal.data2, col = Color.Tran[2], add = TRUE)

7.5 Density plot

เป็นกราฟที่อธิบายการกระจายของข้อมูล ในรูปแบบการประมาณค่าฟังก์ชันการแจกแจง โดยเปลี่ยนจากแท่งเป็นเส้นที่มีความต่อเนื่อง โดยใช้คำสั่ง density( ) ใส่ลงไปในคำสั่ง plot( ) เช่น

plot(x = density(x = Normal.data))

หรือใช้ตัวดำเนินการไปป์ (pipe operator)

Normal.data |> 
      density(x = _) |> 
      plot(x = _)

ข้อควรจำ

สัญลักษณ์ _ หมายถึง การนำคำสั่งหรือวัตถุก่อนหน้า มาใส่ลงในตัวแปรนี้

การใส่สีสำหรับพื้นใต้กราฟ สามารถใช้คำสั่ง polygon( ) โดยเขียนคำสั่งลงในบรรทัดใหม่ ต่อจากคำสั่ง plot( )

plot(x = density(x = Normal.data))
polygon(x = density(x = Normal.data), col = "pink")

การวาด histogram และ density plot ในกราฟเดียวกัน

ทำได้โดยใช้วาด histogram ก่อนด้วยคำสั่ง hist( ) โดยมีค่า freq = FALSE จากนั้นวาด density plot ด้วยคำสั่ง lines( ) ตามตัวอย่าง โดยสามารถปรับเส้นสี หรือขนาดเส้นได้ตามต้องการ

hist(x = Normal.data, freq = FALSE, main = "Histogram")
lines(x = density(x = Normal.data), col = "blue", lwd = 2)

7.6 กราฟพื้นฐานสำหรับข้อมูล 2 มิติ หรือ 2 ตัวแปร

กราฟสำหรับข้อมูล 2 มิติ

กราฟสำหรับ ข้อมูลที่มี 2 ตัวแปร โดยที่เป็นข้อมูลเป็นตัวเลขทั้งคู่ สามารถสร้างกราฟแผนภาพการกระจาย (scatter plot)

หรือเป็นตัวเลขหนึ่งตัวกับตัวแปรอีกหนึ่งตัว จะมีกราฟที่สร้างได้ คือ boxplot volin chart barplot piechart และ donutchart

7.7 แผนภาพการกระจาย (scatter plot)

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

ส่วนประกอบหลักของแผนภาพการกระจายประกอบด้วย:

  • แกน x: แสดงค่าของตัวแปรที่ต้องการวิเคราะห์ในแนวนอน

  • แกน y: แสดงค่าของตัวแปรที่ต้องการวิเคราะห์ในแนวตั้ง

  • จุดข้อมูล: แทนค่าข้อมูลแต่ละจุดบนกราฟ โดยจะอยู่บนตำแหน่งที่สอดคล้องกับค่าของแกน x และแกน y

กราฟช่วยให้เราสามารถระบุแนวโน้มหรือความสัมพันธ์ระหว่างค่าข้อมูลทั้งสองตัวแปรได้ โดยรูปร่างแบบได้แก่ กราฟเป็นรูปจุดกระจายตัวบนแกน x และแกน y ที่แตกต่างกันตามค่าข้อมูลที่แตกต่างกันด้วย

แผนภาพการกระจายในอาร์ ข้อมูลใช้ คือเวคเตอร์ตัวเลข 2 สำหรับแกน x และแกน y ตามลำดับ หรือกรอบข้อมูลที่มีตัวแปรเป็นตัวเลขทั้งคู่

ตัวอย่างข้อมูลจากการจำลองข้อมูล

set.seed(123)
N <- 200
x <- rnorm(n = N, mean = 10, sd = 2)
y <- 3+ 2*x + rnorm(n = N, mean = 0, sd = 3)

การสร้างแผนภาพการกระจายด้วยข้อมูลเวคเตอร์

plot(x = x, y = y)

การสร้างแผนภาพการกระจายด้วยข้อมูลกรอบข้อมูล

Obs <- data.frame(xx = x,  yy = y)

plot(x = Obs$xx, y = Obs$yy)

ในกรณีนี้คำสั่ง attach( ) จะมีประโยชน์ต่อการใช้งาน

คำสั่งย่อยที่ควรทราบ
  • xlab ตั้งช่ือให้แกน x

  • ylab ตั้งช่ือให้แกน y

  • xlim กำหนดช่างความแกน x โดย c(เลขตำ่สุด, เลขสูงสุด)

  • ylim กำหนดช่างความแกน y โดย c(เลขตำ่สุด, เลขสูงสุด)

  • main ตั้งชื่อให้กราฟ

  • pch เลือกเปลี่ยนชนิดจากของจุด ด้วยตัวเลข 0-25

  • cex ขนาดของจุด ใส่ตัวเลขที่มากกว่า 0 ตามต้องการ

จุดแบบต่างๆ ด้วยคำสั่ง pch = ตัวเลข 0-25

จุดแบบต่างๆ ที่สามารถเลือกใช้งานในอาร์

ตัวอย่างการกำหนดค่า col =“red”

ขนาดของจุด ทำได้โดยกำหนด cex = ตัวเลขจำนวนจริงที่มากกว่า 0 โดยมาตราฐาน คือ 1

ขนาดของจุดตั้งแต่ขนาด 1-9
attach(Obs)
plot(x= xx, y = yy)

แต่ต้องไม่ลืมใช้ detach( ) เมื่อเลิกใช้งานทุกครั้ง

detach(Obs)

จากกราฟ ตัวอย่างจะเห็นตัวอย่างอยู่ 1 ค่าที่เป็น outlier ถ้าเราต้องการเน้นย้ำสีให้กับค่าที่ผิดปกติ สามารถทำได้โดย

ขั้นที่ 1 กำหนดสีให้กลับ ค่าปกติ และค่าผิดปกติ ด้วยการสร้างเวคเตอร์สี

Col <- rep(x = "", time = length(xx))
Col[xx>15] <- "red"
Col[xx<=15] <- "black"

ขั้นที่ 2(ถ้าต้องการ) เลือกสร้างชนิดของจุดที่ต้องการระหว่างค่าปกติกับค่าผิดปกติ

Pch <- rep(1, time = length(xx))
Pch[xx>15] <- 19

ก็จะสร้างกราฟที่ต้องเน้นเฉพาะจุดที่ต้องการ

plot(x = xx, y = yy, col = Col, pch = Pch)

7.7.1 การเพิ่มสมการการถดถอยลงไปใแผนภาพการกระจาย

ในโปรแกรมอาร์ มีเส้นแบบตรงให้เลือก คือ สมการเส้นตรง (linear regression line) และสมการไม่เส้นตรง (smoothing line)

การเพิ่มสมการหารถดถอยแบบเส้นตรงทำได้โดย

ใช้คำสั่ง

lm(yy~xx, Obs)

หมายเหตุ สำหรับรายละเอียดคำสั่ง lm( ) ดูได้จาก

help(lm)

หลังจากนั้นก็ใส่ลงไปใน คำสั่ง abline( ) ดังนี้

plot(x = xx, y = yy)
abline(reg = lm(yy~xx, data = Obs))

หมายเหตุ คำสั่ง plot( ) และ abline( ) จะเขียนติดกัน คนละบรรทัด หรือต้องอยู่บล๊อกโค้ดเดียวกัน เพราะเป็นำคำสั่งต่อเนื่อง

สำหรับคำสั่งย่อยใน abline ประกอบไปด้วย
  • col ใส่สีให้เส้นการถดถอย

  • lty ชนิดของเส้นมีเลข 1-6 ที่เลือกใช้ได้

  • lwd ความหนาของเส้นใส่เลขจำนวนจริงทั้งแต่ 1 ขึ้นไป

คำสั่งภายใน lty ถ้า
  • lty = 0 blank

  • lty = 1 เส้นทึบ(solid) (ค่ามาตราฐาน)

  • lty = 2 เส้นขีดสั้น (dashed)

  • lty = 3 เส้นจุด (dotted)

  • lty = 4 เส้นจุด-ขีด (dotdash)

  • lty = 5 เส้นขีดยาว (longdash)

  • lty = 6 เส้นจุด-ขีดยาว (twodash)

เส้นแบบต่างๆ ในอาร์

ตัวอย่างขนาดของเส้นตาม lwd ที่เลือก

ตัวอย่าง

plot(x = xx, y = yy)
abline(reg = lm(yy~xx, data = Obs), 
       col = "red", lty = 5 , lwd = 6)

การใส่ smooth line สามารถใช้คำสั่ง

lowess(x = Obs$xx, y =Obs$yy)

หมายเหตุ สำหรับรายละเอียดคำสั่ง lm( ) ดูได้จาก

help(lowess)

หลังจากนั้นก็ใส่ลงไปใน คำสั่ง abline( ) ดังนี้

plot(x = xx, y = yy)
lines(lowess(Obs$xx, Obs$yy))

เงื่อนไขการใช้และคำสั่งย่อยเหมือน ablines( ) ทุกประการ

ตัวอย่างการเปรียบเทียบ เพื่อพิจารณาใช้สมการเส้นตรง หรือไม่ใช่เส้นตรง โดยใช้ตัวอย่างกรอบข้อมูล cars

attach(cars)
plot(x = speed, y = dist)
abline(lm(dist~speed, data = cars), col = "red")
lines(lowess(x = speed, y = dist), col = "blue")

การเพิ่ม legend ด้วยคำสั่ง legend( ) เพื่อให้สามารถทราบข้อมูลได้ครบถ้วนมากขึ้น

attach(cars)
plot(x = speed, y = dist)
abline(lm(dist~speed, data = cars), col = "red", lty =6)
lines(lowess(x = speed, y = dist), col = "blue", lwd =2)
legend( x= "topleft", 
       legend = c("linear line", "smooth line"),
          col = c("red","blue"), 
          lty = c(6,1),
          lwd = c(1,2))

คำสั่งย่อยภายในที่ สามารถปรับแต่งได้
  • x เลือกได้ ดังนี้ \("\)bottomright\("\), \("\)bottom\("\), \("\)bottomleft\("\), \("\)left\("\), \("\)topleft\("\), \("\)top\("\), \("\)topright\("\), \("\)right\("\) และ \("\)center\("\)

  • legend เวคเตอร์ของชื่อเส้นที่ต้องการ ตามจำนวนเส้นที่มี

  • col เวคเตอร์สีของเส้นที่ต้องการตามลำดับ code

  • lwd เวคเตอร์ของขนาดเส้นในกล่องตามลำดับ code

  • lty เวคเตอร์รูปแบบเส้นในกล่องตามลำดับ code

7.8 กราฟเส้น (line plot) สำหรับข้อมูลอนุกรมเวลา

สำหรับอนุกรมเวลาที่สร้างจากคำสั่ง ts( ) เช่น

set.seed(12345)
customer <-rpois(n = 36,lambda = 100)
customer <- ts(data = customer, start = c(2022,1), frequency = 12)
customer
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2022 105 107  98  95 123 105  97 116  95 103 105  92
2023  74  96 113  88 114  93  82 118  95  99  85 108
2024 121 120 116 102 104  96 103 103  89 127 100  84

สามารถใช้คำสั่ง plot( ) สร้างกราฟเส้นได้ทันที ดังนี้

plot(x = customer)

สำหรับคำสั่งภายในอื่นๆ ก็สามารถใช้ได้ตามปกติ

plot(x = customer, col = "blue", 
     main = " The number of customer per month",
     lwd = 3,
     lty = 2)

หมายเหตุ หนังสือเล่มนี้ไม่ได้สนใจข้อมูลอนุกรมเวลา จากคำสั่ง ts( )

7.9 ฟังก์ชัน curve( )

ในกรณีที่สมการใช้รูปแบบของ

\[ y =f(x),~ x \in [a,b]\]

  • f(x) คือค่าของฟังก์ชันใดๆ ที่เขียนบนอาร์

  • a ค่าต่ำสุดของช่วงพิจารณา

  • b ค่าสูงสุดของช่วงพิจารณา

ตัวอย่าง

\[ y = 3sin(x),~x\in (-2\pi, 2\pi)\]

curve(expr = 3*sin(x), from = -2*pi, to = 2*pi)

การเขียนค่าฟังก์ชัน f(x) ใดๆ ต้องใช้ตัวแปร x เท่านั้น \[ sin(x)e^x,~ x\in (-2\pi, 2\pi)\]

curve(expr = sin(x)*exp(x), from = -2*pi, to = 2*pi)

\[ sin(x)e^x,~ x\in (-2\pi, 2\pi)\]

curve(expr = sin(x)*exp(-x), from = -2*pi, to = 2*pi)

คำสั่งย่อยที่สามารถใช้ได้ คือ
  • type รูปแบบกราฟเส้นที่ต้องการ (ดูตัวอย่างรูปข้างล่าง)

  • add ถ้าต้องการวาดหลายฟังก์ชันในกราฟเดียว ตั้งแต่กราฟฟังก์ชันที่ 2 เป็นให้ กำหนด add = TRUE ทุกกราฟ

  • col สีของเส้นกราฟ

  • lty ชนิดของเส้นกราฟ

  • lwd ขนาดของเส้นกราฟ

  • main ตั้งชื่อกราฟ (ใส่ฟังก์ชัน curve แรกเท่านั้น)

  • xlab ชื่อแกน x (ใส่เฉพาะ ใน curve แรก)

  • ylab ชื่อแกน y (ใส่เฉพาะ ใน curve แรก)

การเพิ่ม legend เพิ่มเป็นคำสั่งสุดท้ายเหมือนกลับการเพิ่มเส้นในแผนภาพการกระจายที่ผ่านมา

curve(expr = 3*sin(x), from = -2*pi, to = 2*pi, 
       col = "red", ylab ="y",main =" graph of function")
curve(expr = 2*sin(x), from = -2*pi, to = 2*pi, lty = 3, 
      col = "blue", add= TRUE)
curve(expr = sin(x), from = -2*pi, to = 2*pi, lty = 4, 
      col = "green", add= TRUE, lwd =3)
legend(x = "bottomleft", 
       legend = c("y = 3sin(x)", "y = 2sin(x)","y = sin(x)"), 
       col = c("red", "blue", "green"),
       lty = c(1,3,4),
       lwd = c(1,1,3))

รูปแบของเส้นที่เลือกได้ของกราฟเส้นทุกแบบ
ชนิด (Type) คำอธิบาย
type = \("\)p\("\) จุด
type = \("\)l\("\) เส้น
type = \("\)b\("\) จุดและเส้นขีด
type = \("\)o\("\) จุดบนเส้น
type = \("\)h\("\) เส้นตั้ง
type = \("\)s\("\) เส้นบันได (เส้นแรกเป็นแนวนอน)
type = \("\)S\("\) เส้นบันได (เส้นแรกเป็นแนวตั้ง)
type = \("\)n\("\) ว่างเปล่า

7.10 แผนภูมิแท่งสแต็ก (Stacked barplot)

เป็นกราฟที่ใช้แสดงการเปรียบเทียบค่าของตัวแปรต่าง ๆ ระหว่างกลุ่มหรือหมวดหมู่ต่าง ๆ โดยแท่งแต่ละแท่งจะแสดงค่าของตัวแปรนั้น ๆ ซึ่งถูกแบ่งเป็นส่วนย่อยๆ ของตัวแปรย่อย โดยแต่ละส่วนย่อยจะแสดงด้วยสีที่แตกต่างกัน

ส่วนประกอบหลักของ stacked barplot ประกอบด้วย:

  • แกน x: แสดงกลุ่มหรือหมวดหมู่ของข้อมูลที่ต้องการเปรียบเทียบ

  • แกน y: แสดงค่าของตัวแปรที่ต้องการวิเคราะห์หรือติดตาม โดยแต่ละแท่งแสดงค่ารวมของตัวแปรย่อยที่อยู่ในกลุ่มหรือหมวดหมู่นั้น

Stacked barplot ช่วยให้เราสามารถเปรียบเทียบค่าของตัวแปรในกลุ่มหรือหมวดหมู่ต่าง ๆ ได้ และสามารถสังเกตความสัมพันธ์ระหว่างค่าของตัวแปรย่อยที่อยู่ในกลุ่มเดียวกันได้ โดยจุดสำคัญที่สังเกตใน stacked barplot คือ:

  • ค่าของแต่ละแท่ง: แสดงค่าของตัวแปรที่ต้องการเปรียบเทียบภายในแต่ละกลุ่มหรือหมวดหมู่

  • สีของแต่ละส่วนย่อย: แสดงตัวแปรย่อยที่อยู่ในกลุ่มหรือหมวดหมู่นั้น ๆ โดยสีที่แตกต่างกันช่วยให้เราสามารถระบุตามแตกต่างได้

ตัวอย่าง มี นศ 100 คน เพศชายและหญิง โดยมาจาก 4 คณะ ได้ข้อมูลดังนี้

set.seed(16)
N <- 100
gender <- sample(x = c("Male","Female"), size = 100, replace = TRUE)
Faculty <- sample(c ("LAW","SCI","ECON","BUS"), size = 100, replace = TRUE)

จากข้อมูลแปรตัวษร/กลุ่มนี้ สามารถใช้คำสั่ง table( ) สร้างตารางได้ 2 แบบ คือ

table.a <- table(gender, Faculty)
table.a
        Faculty
gender   BUS ECON LAW SCI
  Female   9    8   8  16
  Male    13   14  15  17

และ

table.b <- table(Faculty, gender)
table.b
       gender
Faculty Female Male
   BUS       9   13
   ECON      8   14
   LAW       8   15
   SCI      16   17

ด้วยตารางที่แตกต่างกัน จะได้ กราฟแผนภูมิแท่งสแต็ก ที่แตกต่างกัน

barplot(height = table.a, 
           col = brewer.pal(n = 5, name = "Dark2"), 
          main = "Stacked barplot")
legend(x = "topleft",
       legend = row.names(table.b),
         fill = brewer.pal(n = 5, name = "Dark2"))

ข้อสังเกตุ

ถ้ากำหนดจำนวนสีในจานสี มากว่าจำนวนสีที่ใช้จริง กราฟก็จะแสดงค่าสีตามลำดับก่อนหลัง

barplot(height = table.b, 
            col= brewer.pal(n = 4, name = "Dark2"), 
          main = "Stacked barplot")  
legend(x = "topleft",
       legend = row.names(table.b),
         fill = brewer.pal(n = 4, name = "Dark2"))

7.10.1 กราฟแท่งแบบแยกค่าในแต่ละแท่งออกมา (Grouped barplot)

สามารถทำได้โดย กำหนดคำสั่งภายใน beside = TRUE

barplot(height = table.a, 
           col = brewer.pal(n = 4, name = "Dark2"), 
          main = "Grouped barplot", beside = TRUE)
legend(x = "topleft",
       legend = colnames(table.b),
         fill = brewer.pal(n = 4, name = "Dark2"))

7.10.2 แผนภูมิแท่งสแต็กแบบสัดส่วนร้อยละ (Percent stacked barplot)

สามารถทำตารางที่คำนวณสัดส่วนได้โดย นำตารางที่สร้างจากคำสั่ง table( ) ไปใส่ในคำสั่ง prop.table( ) จะได้

prop.table(x = table.a)
        Faculty
gender    BUS ECON  LAW  SCI
  Female 0.09 0.08 0.08 0.16
  Male   0.13 0.14 0.15 0.17

จะเห็นว่า เมื่อนำทุกในตารางมารวมกันจะมีค่าเท่า 1

ถ้ากำหนด margin = 1 หมายความว่า ผลรวมแต่ละแถวจะมีค่าเท่ากับ 1

prop.table(x = table.a, margin = 1)
        Faculty
gender         BUS      ECON       LAW       SCI
  Female 0.2195122 0.1951220 0.1951220 0.3902439
  Male   0.2203390 0.2372881 0.2542373 0.2881356

ถ้ากำหนด margin = 2 หมายความว่า ผลรวมแต่ละหลักจะมีค่าเท่ากับ 1

prop.table(x = table.a, margin = 2)
        Faculty
gender         BUS      ECON       LAW       SCI
  Female 0.4090909 0.3636364 0.3478261 0.4848485
  Male   0.5909091 0.6363636 0.6521739 0.5151515

ทำให้สร้างแผนภูมิแท่งสแต็กแบบสัดส่วนร้อยละ ได้โดยใช้คำสั่งเดิม

barplot(height = prop.table(x = table.a, margin = 2), 
            col= brewer.pal(n = 5,name = "Set3"), 
          main = "Percent Stacked barplot")  
legend(x = "topleft",
       legend = colnames(table.b),
         fill = brewer.pal(n = 5,name = "Set3"))

7.11 แผนภูมิกล่อง (boxplot)

แผนภูมิกล่องหน้าเป็นกราฟที่ใช้แสดงการกระจายข้อมูลทางสถิติของตัวแปร โดยแสดงข้อมูลในรูปแบบของกล่องและเส้น Whisker

ส่วนประกอบหลักของ boxplot ประกอบด้วย:

  • กล่อง (Box): แสดงการกระจายของข้อมูลระหว่างควอไทล์ที่ 1 (lower quartile) ถึงควอไทล์ที่ 3 (upper quartile) โดยกล่องจะถูกแบ่งเป็นส่วนสองส่วนเท่ากันที่ควอไทล์ที่ 2 (median) ตรงกลางกล่อง

  • เส้น Whisker: แสดงการกระจายข้อมูลระหว่างควอไทล์ที่ 1 และควอไทล์ที่ 3 โดยเส้น Whisker จะยาวไปจนถึงข้อมูลที่ไม่ถือเป็นค่าผิดปกติ (outliers) ซึ่งอาจถูกแสดงเป็นจุดบนกราฟหรือแยกออกเป็นข้อมูลแยก

Boxplot ช่วยให้เราสามารถระบุและวิเคราะห์คุณสมบัติสถิติของข้อมูล ได้ โดยจุดสำคัญที่สังเกตใน boxplot คือ:

  • กล่อง (Box): สามารถใช้วัดการกระจายของข้อมูลระหว่าง quartile 1 และ quartile 3 และกำหนดให้เห็นการกระจายของค่ามากหรือน้อยกว่า median ด้วย

  • เส้น Whisker: แสดงการกระจายข้อมูลระหว่างควอไทล์ที่ 1 และควอไทล์ที่ 3 และสามารถช่วยในการตรวจสอบข้อมูลแปลกปลอมหรือค่าผิดปกติที่เกินขอบเขตของการกระจายปกติ

  • ค่าผิดปกติ (Outliers): ค่าตัวแปรที่ห่างจากข้อมูลปกติ และอาจถูกแสดงเป็นจุดบนกราฟหรือแยกออกมาแสดงเป็นข้อมูลแยกในกราฟ

ในกราฟนี้จะใช้ตัวอย่างจากจากข้อมูล

data("ToothGrowth") 
str(ToothGrowth)
'data.frame':   60 obs. of  3 variables:
 $ len : num  4.2 11.5 7.3 5.8 6.4 10 11.2 11.2 5.2 7 ...
 $ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 2 2 2 2 ...
 $ dose: num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...

ข้อมูล ToothGrowth

  • len ขนาดของความยาวฟัน

  • supp สูตรยา OJ และ VC

  • dose ปริมาณที่ให้ 0.5, 1, 2 มิลลิกรัม/วัน

กรณีที่ข้อมูลเป็นตัวแปรตัวเลข 1 มิติจะสามารถสร้างด้วยคำสั่ง boxplot( ) ดังนี้

boxplot(x = ToothGrowth$len)

formula

การสร้างสูตร (formula) ใช้สัญลักษณ์ ~ (ทิลด์) ซึ่งใช้ในการระบุความสัมพันธ์ระหว่างตัวแปรในแบบจำลองสถิติหรือการวิเคราะห์ข้อมูลต่าง ๆ

รูปแบบทั่วไปของคำสั่งสร้างสูตรคือ:

dependent variable ~ independent var 1 + independent var1 2 +...+independent var n
ตัวแปรตาม ~ ตัวแปรอิสระ1 + ตัวแปรอิสระ2 + ...+ ตัวแปรอิสระn
y ~ x1 +x2 +x3 ...+ xn

โดยทั่วไปแล้ว ตัวแปรตาม (response variable) จะเป็นตัวแปรที่ต้องการวิเคราะห์หรือทำนาย ในขณะที่ตัวแปรอิสระ (predictor variables) จะเป็นตัวแปรที่ใช้ในการอธิบายหรือสอดคล้องกับตัวแปรตาม

ตัวอย่าง

len ~ dose

ถ้ากรอบข้อมูลมีเรียงตัวแปร จาก (ตัวแปรตาม, ตัวแปรอิสระ1, ตัวแปรอิสระ2, …, ตัวแปรอิสระn)

สามารถใช้ฟังก์ชัน formula( ) ช่วยเขียนได้ เช่น

formula(ToothGrowth)
len ~ supp + dose

กรณีต่อไป ในกรอบข้อมูลที่มีอยู่ จะถูกใช้งานทั้งหมด เพื่อเข้าสูตรสมการที่ต้องการ โดยมี 1 ตัวเป็นตัวแแปร ตาม และตัวแปรที่เหลือเป็นตัวแปรอิสระทั้งหมดสามารถใช้ วิธีการเขียนนี้ได้ เช่น

ตัวแปรตาม ~ .

การเห็นความสัมพันธ์ระหว่างตัวแปร len กับ dose (ตัวแปรตัวเลข กับ ตัวแปรอักษร หรือตัวแปร factor หรือเป็นตัวแปรที่ตัวเลขเป็นจำนวนเต็ม (ค่าในตัวตัวแปรสื่อถึงกลุ่ม ระดับ มากน้อย) ) สามารถสร้างกราฟกล่องได้โดย

boxplot(len ~ dose, data = ToothGrowth)

ถ้าต้องการหมุนกราฟ ให้ตั้งค่า horizontal = TRUE

boxplot(len ~ dose, data = ToothGrowth, horizontal = TRUE)

การใส่เหมือนกราฟแบบอื่นๆให้เพื่อ คำสั่ง col = เวคเตอร์ของสีที่ต้องการ

boxplot(len ~ dose, data = ToothGrowth,
        col = brewer.pal(n = 3, name = "Set2"))

ถ้ามีตัวแปรอิสระตั้งแต่สองตัวสามารถกระจายกราฟของ len ได้ดังนี้

boxplot(len ~ supp + dose, data = ToothGrowth,
        col = brewer.pal(n = 3, name = "Set3"))

หรือ

boxplot(len ~ ., data = ToothGrowth, col 
        = brewer.pal(n = 3, name = "Set3"))

การสลับที่มีผลต่อกราฟที่ได้ ต้องระวังให้ว่าต้องการนำเสนออะไร

boxplot(len ~  dose + supp, data = ToothGrowth,
        col = brewer.pal(n = 3, name = "Set3"))

7.11.1 การรวมกราฟหลายกราฟเป็นกราฟเดียว

ในหัวข้อที่ผ่านมาจะเห็นว่ามีกราฟให้งานหลากหลายชนิด ในบ้างปัญหาอาจจำเป็นจะต้องรวมกราฟที่ต้องการนำเสนอมารวมอยู่ในกราฟเดียวกัน

เราสามารถทำได้ โดยใช้คำสั่ง

par(mfrow = c(จำนวนกราฟต่อแถว, จำนวนกราฟต่อหลัก))

จำนวนกราฟต้องแถว และต่อหลักเป็นเลขจำนวนเต็มบวก

ตัวอย่างเช่น กำหนด par(mfrow = c(2, 2)) หมายความว่าจะมีกราฟทั้งหมด 4 ภาพในหนึ่งกราฟ

set.seed(1)
n <- 200
x <- rnorm(n)
y <- sample(LETTERS[1:4],n, replace = TRUE)
z <- 3*x+5 + rnorm(n = n,mean = 0, sd =1)
par(mfrow = c(2, 2))
# กราฟที่ 1
hist(x, main = "histogram")
# กราฟที่ 2
barplot(table(y),  main = "barplot")
# กราฟที่ 3
plot(x,z, main = "scatter plot")
# กราฟที่ 4
boxplot(len ~ dose, data = ToothGrowth, main ="boxplot")

การเรียงลำดับจากกราฟ จากซ้ายไปขวา แล้วจึงลงไปที่แถวต่อไป

ถ้าต้องการกราฟ 1 แถว แถวละ 2 รูป จะได้

par(mfrow = c(1, 2))
# กราฟที่ 1
hist(x, main = "histogram")
# กราฟที่ 2
barplot(table(y),  main = "barplot")

หรือ 2 แถว แถวละ 1 กราฟจะได้

ถ้าต้องการต้องการตั้งชื่อกราฟให้กับกราฟรวมให้ใช้คำสั่ง

title(“ชื่อกราฟที่ต้องการ”, line = -1, outer = TRUE)

ต่อท้าย คำสั่งในกราฟสุดท้าย ดังตัวอย่างนี้

par(mfrow =c(1, 2))
# กราฟที่ 1
plot(x,z, main ="scatter plot")
# กราฟที่ 2
boxplot(len ~ dose, data = ToothGrowth, main ="boxplot")
title("Example of combine graph", line = -1, outer = TRUE)

7.11.2 การปรับแต่งการรวมกราฟด้วยคำสั่ง layout( )

ขั้นที่ 1 ออกแบบโครงสร้างที่ต้องการก่อน ด้วยคำสั่ง matrix

lay <- matrix(c(1, 1, 2, 3) , nrow = 2, byrow = TRUE)
lay
     [,1] [,2]
[1,]    1    1
[2,]    2    3

เมตริกซ์นี้หมายความว่า

ภาพที่ 1 อยู่ที่แถวที่ 1 มีขนาดเท่ากับ 2 หลัก

ภาพที่ 2 จะอยู่ที่แถวที่ 2 หลักที่ 1

ภาพที่ 3 จะอยู่ที่แถวที่ 2 หลักที่ 2

ขั้นที่ 2 นำเมตริกซ์ที่ได้ใส่ลงในคำสั่ง layout( ) แล้วตามด้วยคำสั่งกราฟที่ต้องการสร้างจำนวน 3 กราฟ เช่น

layout(lay)
# กราฟ 1
hist(x, main = "histogram")
# กราฟ 2
barplot(table(y),  main = "barplot")
# กราฟ 3
plot(x,z, main = "scatter plot")
title("complex layout graph", line = -1, outer = TRUE)

ตัวอย่างต่อไป

lay <- matrix(c(1,2,1,3) # number is the plot number
              , nrow = 2, byrow = T)
lay
     [,1] [,2]
[1,]    1    2
[2,]    1    3

เมตริกซ์นี้หมายความว่า

ภาพที่ 1 อยู่ที่หลักที่ 1 ทั้ง 2 แถว

ภาพที่ 2 จะอยู่ที่แถวที่ 1 หลักที่ 2

ภาพที่ 3 จะอยู่ที่แถวที่ 2 หลักที่ 2

layout(lay)
# กราฟ 1
hist(x, main = "histogram")
# กราฟ 2
barplot(table(y),  main = "barplot")
# กราฟ 3
plot(x,z, main = "scatter plot")
title("Another complex layout graph", line = -1, outer = TRUE)

7.11.3 การสร้างกราฟเปล่า (empty plot)

สามารถใช้คำสั่ง plot.new( )

plot.new( )

ตัวอย่างเช่น

par(mfrow = c(2,2))
# กราฟ 1
hist(x, main = "histogram")
# กราฟ 2 (กราฟเปล่า)
plot.new( )
# กราฟ 3
barplot(table(y),  main = "barplot")

7.12 QQ plot (Quantile-Quantile plot)

เป็นกราฟที่ใช้ในการวิเคราะห์การกระจายของข้อมูลว่าเป็นการกระจายแบบไหน โดยเปรียบเทียบความเป็นไปได้ของค่าที่สังเกตได้จากข้อมูลกับความเป็นไปได้ทางทฤษฎี

ใน QQ plot จะมีแกน x เป็นความเป็นไปได้ทางทฤษฎี (quantiles) ของการกระจายที่ต้องการตรวจสอบ เช่น quantiles ของการกระจายปกติ (normal distribution) และแกน y เป็นค่าที่สังเกตได้จากข้อมูลจริง

หากข้อมูลมีการกระจายแบบปกติ (normal distribution) ใน QQ plot จะมีจุดกระจายอยู่บนเส้นทแยงมุม 45 องศา หากข้อมูลมีการกระจายแตกต่างจากการกระจายปกติ เช่น การกระจายแบบตัวแปรที่เบี่ยงเบนหรือแบบแข็งแรง เส้นกราฟใน QQ plot จะมีรูปร่างที่เบี่ยงเบนหรือโค้ง

การวิเคราะห์ QQ plot สามารถช่วยในการตรวจสอบว่าข้อมูลมีการกระจายแบบไหน เช่นการกระจายปกติหรือไม่ และการปรับแบบจำลองสถิติที่ใช้ในการวิเคราะห์ข้อมูล เพื่อให้เหมาะสมกับข้อมูลที่มีอยู่

สสำหรับสร้าง QQ plot ในอาร์สามารถใช้ฟังก์ชัน qqnorm( ) สำหรับภาพการกระจาย (scatter plot) และใช้คำสั่ง qqline( ) สำหรับสร้างเส้นตรง 45องศา จากข้อมูลต้องการพิจารณาว่ามีความเหมาะสมว่าจะมีการแจกแจงแบบปกติหรือไม่

ตัวอย่าง ข้อมูลจำลองสร้างจากการแจกจงแบบปกติ

set.seed(101)
X <- rnorm(n = 100, mean = 0, sd = 2) 
qqnorm(X) 
qqline(X) 

จะเห็นได้ชัดเจนว่า จุดต่างๆ วิ่งไปเส้นตรง โดยไม่ห่างมาก และส่วนหางซ้ายและขวา จะมีจุดที่ห่างจากเส้นไม่มาก ทำให้เราสามารถบอกได้ว่า ข้อมูลชุดนี้อาจจะมีการแจกแจงแบบปกติ

ตัวอย่างข้อมูลจำลองที่ไม่ได้มาจากการแจกแจงแบบปกติ

set.seed(101)
XX <- rt(n = 100, df = 4) 
qqnorm(XX) 
qqline(XX) 

หางซ้ายและหางขวา มีจุดที่ห่างจากเส้นตรงมาก ซึ่งเห็นได้อย่างชัดเจน ทำให้สรุปได้ว่า ข้อมูลนี้ไม่ใช่การแจกแจงแบบปกติ

7.13 คำสั่งภายในบางคำสั่งอาจจะต้องใช้ตามความเหมาะสม

จะสังเกตุเห็นได้ว่ากราฟบางแบบ มีกรอบล้อมรอบ บางชนิดก็ไม่มี เช่น QQ plot ที่ผ่านมีกรอบ แต่ ฮิตโทแกรมไม่มีกรอบ ดังนั้น ถ้าต้องการให้มีกรอบ จะต้องกำหนดคำสั่งภายใน frame.plot = FALSE

ถ้ากราฟไม่มีกรอบอยู่แล้ว ก็อาจจะไม่สามารถกำหนด frame.plot = TRUE เพื่อวาดกรอบได้

par(mfrow =c(1, 2))
# กราฟที่ 1
plot(x = mtcars$mpg, y = mtcars$disp,  main = "with frame")
# กราฟที่ 2
plot(x = mtcars$mpg, y = mtcars$disp,
     main = "without frame", frame.plot = FALSE)

par(mfrow =c(1, 2))
XX <- rt(n = 100, df = 4) 
# กราฟที่ 1
qqnorm(X, main = "QQ plot with frame") 
qqline(X) 
# กราฟที่ 2
qqnorm(X, main = "QQ plot without frame", frame.plot = FALSE ) 
qqline(X) 

7.14 การเปลี่ยนสีพื้นหลังของกราฟทั้งหมด

สามารถทำได้โดยกำหนด

par( bg = "สีที่ต้องการ")

แล้วตามด้วยคำสั่งกราฟที่ต้องการ เช่น

par(bg = "gray")
hist(x = X, col = "red")

ถ้าต้องการพื้นหลังให้สีโปร่งแสง สามารถทำได้โดยกำหนด
par(bg = NA)

7.14.1 การเปลี่ยนสีพื้นหลังภายในกรอบ

# step 0: เลือกสี bg ที่ต้องการ ถ้าไม่ต้องการก็สามารถข้ามไปได้
par(bg = "gray")
# step 1: วาดกราฟที่ต้องการ กำหนดคำสั่งภายในที่ต้องการ
barplot(table(y),  main = "barplot" , ylim = c(0, 65),
        col = brewer.pal(n =4, name = "Set2"))
# step 2 กำหนดสีของกรอบที่ต้องการ 
rect( xleft = par("usr")[1], ybottom = par("usr")[3],
     xright = par("usr")[2], ytop  = par("usr")[4],
     col = "blue")
# step 3 วาดกราฟเดิมลงกรอบที่สร้าง
par(new = TRUE)
barplot(table(y),  main = "barplot" , ylim = c(0, 65),
        col = brewer.pal(n = 4, name = "Set2"))

7.14.2 ค่าตัวแปรภายในคำสั่ง par( ) ที่สามารถเปลี่ยนแปลงได้

สามารถดูได้โดยใช้คำสั่ง str( )

str(par( ))

การสร้างกราฟด้วยภาษาอาร์ยังมี อีกมากมายหมายหลายแบบที่ไม่ได้กล่าวถึง และรูปแบบการเขียนคำสั่งอาจจะแตกต่างกัน แต่ได้ผลลัพธ์เดียวกัน ซึ่งเป็น ของข้อดีการเขียนคำสั่งเพื่อสั่งการทำงานในรูปแบบของเราเอง แต่ก็อาจจะสร้างความสับสนทำให้ผู้อ่านมือใหม่ได้ง่าย สำหรับการสร้างกราฟเส้นที่แสดงข้อมูลตัวเลขของอนุกรมเวลา จะกล่าวถึงในบทที่ 9 ซึ่งต้องใช้ความรู้เรื่องวัตถุที่เก็บข้อมูลอนุกรมเวลาที่เรียกว่าวัตถุวัตถุแบบ xts ซึ่งมีรูปแบบเฉพาะ ที่แตกต่างการข้อมูลแบบเวคเตอร์ หรือกรอบข้อมูล