Data Visualization
with ggplot2
การสร้างภาพข้อมูลหรือ Data Visualization ช่วยให้เราเข้าใจชุดข้อมูลที่มีความซับซ้อนได้ง่ายขึ้นและทำให้เราตัดสินใจในการจัดการกับข้อมูลเร็วขึ้น ซึ่ง Data Visualization สามารถทำได้ทั้งก่อนและหลังการวิเคราะห์เชิงสถิติ
การสร้างภาพข้อมูลใน R
สามารถทำได้จากหลากหลาย package ซึ่งในบทเรียนนี้เราจะใช้ package ggplot2
ซึ่งเป็น package ที่ช่วยให้เราสามารถสร้างกราฟิคได้หลากหลาย และสามารถปรับแต่งรูปแบบต่าง ๆ ได้ในแบบที่ต้องการ
#load packages
library(ggplot2)
library(psych)
library(Rmisc)
Mtcars data
ใน tutorial นี้เราจะใช้ข้อมูลที่มีอยู่แล้วใน package ggplot2
ชื่อว่า mtcars
ในการสร้างกราฟฟิค หลังจาก import mtcars
ลงมาแล้ว เราสามารถเซ็ตค่าตัวแปรได้ตามนี้
data("mtcars")
mtcars$vs <- factor(mtcars$vs, labels = c("V", "S"))
mtcars$am <- factor(mtcars$am, labels = c("automatic", "manual"))
mtcars$cyl <- as.factor(mtcars$cyl)
mtcars$gear <- as.factor(mtcars$gear)
mtcars$carb <- as.factor(mtcars$carb)
psych::describe(mtcars)
## vars n mean sd median trimmed mad min max range skew
## mpg 1 32 20.09 6.03 19.20 19.70 5.41 10.40 33.90 23.50 0.61
## cyl* 2 32 2.09 0.89 2.00 2.12 1.48 1.00 3.00 2.00 -0.17
## disp 3 32 230.72 123.94 196.30 222.52 140.48 71.10 472.00 400.90 0.38
## hp 4 32 146.69 68.56 123.00 141.19 77.10 52.00 335.00 283.00 0.73
## drat 5 32 3.60 0.53 3.70 3.58 0.70 2.76 4.93 2.17 0.27
## wt 6 32 3.22 0.98 3.33 3.15 0.77 1.51 5.42 3.91 0.42
## qsec 7 32 17.85 1.79 17.71 17.83 1.42 14.50 22.90 8.40 0.37
## vs* 8 32 1.44 0.50 1.00 1.42 0.00 1.00 2.00 1.00 0.24
## am* 9 32 1.41 0.50 1.00 1.38 0.00 1.00 2.00 1.00 0.36
## gear* 10 32 1.69 0.74 2.00 1.62 1.48 1.00 3.00 2.00 0.53
## carb* 11 32 2.72 1.37 2.00 2.65 1.48 1.00 6.00 5.00 0.35
## kurtosis se
## mpg -0.37 1.07
## cyl* -1.76 0.16
## disp -1.21 21.91
## hp -0.14 12.12
## drat -0.71 0.09
## wt -0.02 0.17
## qsec 0.34 0.32
## vs* -2.00 0.09
## am* -1.92 0.09
## gear* -1.07 0.13
## carb* -0.95 0.24
โดยข้อมูลประกอบไปด้วย
mpg
- จำนวนแกลลอนของน้ำต่อ 1 ไมล์
cyl
- จำนวนกระบอกสูบ
disp
- ความจุของเครื่องยนต์ (ลูกบาศก์นิ้ว)
hp
- แรงม้า
drat
- สัดส่วนของเพลากลางของรถ
wt
- น้ำหนัก
qsec
- ความเร่ง
vs
- รูปร่างของเครื่องยนต์ ‘V’ หรือ ‘S’
am
- ระบบเกียร์อัตโนมัติ (auto) หรือ เกียร์กระปุก (manual)
gear
- จำนวนเกียร์
carb
- จำนวนตัวเผาไหม้เครื่องยนต์
Ggplot2 Package
Ggplot2 เป็น package ในรูปแบบของ Grammar of Graphic ที่ความยืดหยุ่น ซึ่งในการเขียนคำสั่งของ ggplot2
นั้นจะมีลักษณะเป็นการเรียงคำสั่งในแต่ละขั้น โดยปกติแล้วคำสั่งที่ใช้งานพื้นฐานจะประกอบไปด้วย
data
- การเรียกข้อมูลที่ใช้งานaesthetic mappings
- การเลือกตัวแปรที่จะปรากฎอยู่ในกราฟgeometric objects
- การเลือกวิธีการสร้างกราฟฟิคCustomizing
เช่น การใส่ชื่อ เลือกธีม หรือลงสีให้กราฟ
นอกจากนี้ยังมีคำสั่งอื่น ๆ ที่มีความซับซ้อนมากขึ้น หากเราเริ่มคุ้นเคยกับคำสั่งพื้นฐานแล้ว เราสามารถศึกษาเพิ่มเติมให้กราฟฟิคมีความสวยงามและตรงตามความต้องการของเรามากขึ้นได้
การสร้างกราฟ
ก่อนที่เราจะสร้างกราฟ เราควรสังเกตตัวแปรที่เราต้องการนำมาสร้างว่าเป็นตัวแปรลักษณะใด โดยสามารถใช้คำสั่ง str()
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : Factor w/ 2 levels "V","S": 1 1 2 2 1 2 1 2 2 2 ...
## $ am : Factor w/ 2 levels "automatic","manual": 2 2 2 1 1 1 1 1 1 1 ...
## $ gear: Factor w/ 3 levels "3","4","5": 2 2 2 1 1 1 1 2 2 2 ...
## $ carb: Factor w/ 6 levels "1","2","3","4",..: 4 4 1 1 2 1 4 2 2 4 ...
หลักการในการสร้างกราฟฟิคคือ การสังเกตจำนวนตัวแปรและลักษณะของตัวแปรในแกน x และ y โดยลักษณะของตัวแปรนี้จะเป็นการคัดรูปแบบกราฟของเรา ในบทเรียนนี้เราจะเรียนรู้สร้าง boxplot, bar graph และ line graph ค่ะ
การสร้าง boxplot
ในการสร้าง boxplot (หรือกราฟลักษณะอื่น ๆ) เราจะเริ่มกันที่การสร้างคำสั่งพื้นฐาน คือ data
และ aesthetic mappings
โดยคำสั่งทั่วไปคือ ggplot(data = ชื่อไฟล์, aes(x = ตัวแปรแกน x, y = ตัวแปรแกน y)
คำสั่ง aes()
สามารถเซ็ตค่าอื่น ๆ ได้ เช่น
- ตำแหน่งของตัวแปร (
x =
และy =
) - สี: โดย
color=
เป็นสีเส้นขอบ และfill=
เป็นสีด้านใน shape =
รูปร่างของจุดข้อมูล และsize =
ขนาดของจุดข้อมูล
ggplot(data = mtcars, aes(x = am, y = mpg))
ถ้าเรา run
คำสั่งข้างต้น เราจะพบว่า กราฟฟิคมีเพียง background
(หรือ coordinate system
) และชื่อตัวแปรของเราเท่านั้น ดังนั้นเราจึงจำเป็นต้องเขียนคำสั่งว่าเราต้องการให้กราฟออกมาเป็นรูปแบบใด (สามารถเข้าไปดูรูปแบบทั้งหมดได้ที่
help.search("geom_", package = "ggplot2")
สำหรับการสร้าง boxplot เราจะใช้คำสั่ง geom_boxplot()
เพื่อเซ็ตค่า geometric objects
ggplot(data = mtcars, aes(x = am, y = mpg)) +
geom_boxplot()
จะเห็นว่ากราฟ boxplot ที่สร้างขึ้นมามีเพียงตัวแปร x และ y หากเราต้องการจัดกลุ่มตัวแปร เราสามารถใช้คำสั่ง fill = ตัวแปรจัดกลุ่ม
ใน aesthetic mapping
เพื่อให้มีการจัดกลุ่มของตัวแปรในกราฟ
ggplot(data = mtcars, aes(x = am, y = mpg, fill = vs)) +
geom_boxplot()
หากเราต้องการให้กราฟมีสีสันและชื่อแกนตามที่เราต้องการ เราสามารถเขียนคำสั่งต่อจาก คำสั่ง geometric ได้
ตัวอย่างคำสั่งอื่น ๆ ในการปรับแต่งกราฟ
- เพิ่มลักษณะกราฟฟิค:
- หากเราอยากให้
ggplot2
สร้างจุดข้อมูลในกราฟของเรา เราสามารถสั่งคำสั่งgeom_jitter()
หลังจาก geometric objects หลักของเราได้
- หากเราอยากให้
- ตกแต่งกราฟ:
- ใช้คำสั่ง
alpha = ค่าโปรงใส
เพื่อเพิ่มความโปร่งใสของกราฟ - ใช้คำสั่ง
width = ค่าความกว้างของกราฟ
ในการกำหนดความกว้างของกราฟ
- ใช้คำสั่ง
- เพิ่มชื่อ:
- แกน x และ y: ใช้คำสั่ง
xlab = "ชื่อแกน x"
และylab = "ชื่อแกน y"
- ชื่อหัวกราฟ: ใช้คำสั่ง
ggtitle("ชื่อหัวกราฟ")
- แกน x และ y: ใช้คำสั่ง
- เลือกใช้ theme:
- ธีมของกราฟ: ใช้คำสั่ง
theme_
ในการเลือกใช้ theme โดย คำสั่งtheme_classic
จะใกล้เคียงกับ APA - สีของกราฟ:
- เลือกจาก palette ที่มีชุดคำสั่งสี
- สีเส้นขอบ:
scale_color_brewer(palette = "ชื่อ palette ที่ต้องการ")
- สีช่องในกล่องหรือคอลัมน์:
scale_fill_brewer(palette = "ชื่อ palette ที่ต้องการ")
- สีเส้นขอบ:
- เลือกสีเอง
- สีเส้นขอบ:
scale_color_manual(values=c("สีที่1", "สีที่2", "สีที่3"))
- สีช่องในกลุ่มหรือคอลัมน์:
scale_fill_manual(values=c("สีที่1", "สีที่2", "สีที่3"))
- สีเส้นขอบ:
- เลือกจาก palette ที่มีชุดคำสั่งสี
- ธีมของกราฟ: ใช้คำสั่ง
Note: หากเลือกสีเอง จำนวนสีต้องเท่ากับจำนวนกลุ่มตัวแปรที่ต้องการจะให้มีสี
ggplot(data = mtcars, aes(x = am, y = mpg, fill = vs)) +
geom_boxplot(alpha = 0.7, width = 0.6) +
geom_jitter(alpha = 0.2, size = 2) +
xlab("Types of Gear transmissions") +
ylab("Miles per Gallon") +
ggtitle("Motor Trend Car Road Tests") +
theme_classic() +
scale_color_brewer(palette="Accent") +
scale_fill_brewer(palette="Accent")
จะเห็นได้ว่าสีของกล่องข้อมูลเปลี่ยนไปตามที่เราตั้งค่าไว้ และมีการแสดงของจุดข้อมูลที่มาจากชุดคำสั่ง geom_jitter()
โดยมีความโปร่งใสของจุดข้อมูลให้เห็นในกราฟ
การสร้าง BarGraph
การสร้าง BarGraph เหมาะสมกับตัวแปรต้นที่มีลักษณะเป็นกลุ่ม (discrete variable) ดังนั้นโครงสร้างของชุดคำสั่งจะคล้ายคลึงกับการสร้าง boxplot
เราสามารถสร้าง bar graph ได้ 2 วิธีคือ
geom_bar()
จะมีคำสั่งพื้นฐานโดยมีความสูงของกราฟจากสัดส่วนของ n ในข้อมูลgeom_col()
จะมีคำสั่งพื้นฐานโดยมีความสูงของกราฟเป็นค่าของข้อมูลนั้น ๆ คำสั่งนี้จะเหมาะสมกับข้อมูลที่ผ่านการหาค่าสถิติเชิงพรรณามาแล้ว (เช่นค่า n, mean, sd, se) และนำไปใช้งานได้สะดวกกว่าเมื่อต้องการสร้างerror_bar
ดังนั้น หากต้องการสร้าง bar graph อย่างง่าย เราสามารถใช้คำสั่ง geom_bar()
ได้ โดยเพิ่มคำสั่ง stat = "summary"
เมื่อต้องการค่าเฉลี่ย (mean) หรือ stat = "identity"
เมื่อต้องการค่าผลรวม (sum)
นอกจากนี้แล้ว การสร้าง bar graph ยังสามารถเลือกการวางตัวของกราฟได้ โดยใช้คำสั่ง position =
โดยค่าพื้นฐานของ geom_bar()
คือ position = "stack"
โดยจะเป็นการต่อกันของข้อมูลในแต่ละกลุ่ม ถ้าต้องการให้กราฟอยู่แยกกัน เราจะใช้คำสั่ง position = "dodge"
หรือ position = position_dodge(ค่าความห่าง)
# x axis is am
# stack
stack <- ggplot(data = mtcars, aes(x = am, y = mpg, fill = vs)) +
geom_bar(stat = "summary") +
ggtitle("stack") +
theme_classic()
# dodge
dodge <- ggplot(data = mtcars, aes(x = am, y = mpg, fill = vs)) +
geom_bar(stat = "summary", position = position_dodge(0.9)) +
ggtitle("dodge") +
theme_classic()
#x axis is vs
# stack
stack2 <- ggplot(data = mtcars, aes(x = vs, y = mpg, fill = am)) +
geom_bar(stat = "summary") +
ggtitle("stack") +
theme_classic()
# dodge
dodge2 <- ggplot(data = mtcars, aes(x = vs, y = mpg, fill = am)) +
geom_bar(stat = "summary", position = position_dodge(0.9)) +
ggtitle("dodge") +
theme_classic()
describeBy(mpg ~ am * vs, data = mtcars)
##
## Descriptive statistics by group
## am: automatic
## vs: V
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 12 15.05 2.77 15.2 15.1 2.3 10.4 19.2 8.8 -0.28 -0.96 0.8
## ------------------------------------------------------------
## am: manual
## vs: V
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 6 19.75 4.01 20.35 19.75 3.85 15 26 11 0.21 -1.53 1.64
## ------------------------------------------------------------
## am: automatic
## vs: S
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 7 20.74 2.47 21.4 20.74 3.26 17.8 24.4 6.6 0.1 -1.75 0.93
## ------------------------------------------------------------
## am: manual
## vs: S
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 7 28.37 4.76 30.4 28.37 4.6 21.4 33.9 12.5 -0.35 -1.73 1.8
การสร้างกราฟที่มี Error Bar
ในการสร้างกราฟแบบ bar graph และ line graph เราสามารถที่จะแสดงผลความคลาดเคลื่อนข้อมูลโดยเพิ่มคำสั่ง geom_errorbar()
โดยเราสามารถหาค่า sd, se, หรือ ci จากข้อมูลที่เรามีก่อนการสร้าง Error Bar โดยใช้คำสั่ง summarySE()
จาก package Rmisc
โดยใช้คำสั่ง
summarySE(ชื่อไฟล์, measurevar = "ชื่อตัวแปรที่ต้องการหาค่ามาตรฐาน", groupvars = c("ชื่อกลุ่ม 1", "ชื่อกลุ่ม 2"))
library(Rmisc)
sum <- summarySE(mtcars, measurevar="mpg", groupvars=c("am","vs"))
sum
## am vs N mpg sd se ci
## 1 automatic V 12 15.05000 2.774396 0.8008991 1.762767
## 2 automatic S 7 20.74286 2.471071 0.9339769 2.285359
## 3 manual V 6 19.75000 4.008865 1.6366124 4.207046
## 4 manual S 7 28.37143 4.757701 1.7982418 4.400139
เมื่อได้ค่าความคลาดเคลื่อนออกมาแล้ว เราจะสร้างกราฟจาก object ที่มาจาก summarySE()
นี้
โดยในการสร้าง line graph เราจะใช้คำสั่ง geom_point()
และ geom_line()
โดย geom_point()
จะเป็นการกำหนดให้กราฟมีจุดที่เป็นค่า mean และ geom_line()
จะเป็นการใส่เส้นกราฟ ซึ่งเราสามารถเซ็ตให้กราฟมีการแยกกลุ่มตามที่เรากำหนดโดยใส่ aes(group = ตัวแปรจัดกลุ่ม)
จากนั้น เพิ่มคำสั่ง geom_errorbar()
ในการสร้าง error bar โดยใช้คำสั่ง aes(ymin = ชื่อตัวแปรค่า mean - ci, ymax = ชื่อตัวแปรค่า mean + ci)
(Note: เราสามารถใช้ค่า sd หรือ se ในการสร้าง error bar ได้โดยการเปลี่ยน ci
เป็น sd
หรือ se
)
หากกราฟที่ปรากฎออกมามีค่าแกน x และ y ที่ไม่สมดุล เราสามารถใช้คำสั่ง xlim()
หรือ ylim()
เพื่อปรับแก้สเกลให้เหมาะสมได้
#only plot
line.plot <- ggplot(sum, aes(x = am, y = mpg, color = vs)) +
geom_point(position = position_dodge(.2)) +
geom_line(aes(group = vs), position = position_dodge(.2)) +
ylim(5, 35) +
ggtitle("Line Plot without Error Bar") +
theme_classic() +
scale_color_brewer(palette="Accent")
#with error
line.error <- ggplot(sum, aes(x = am, y = mpg, color = vs)) +
geom_point(position = position_dodge(.2)) +
geom_line(aes(group = vs), position = position_dodge(.2)) +
geom_errorbar(aes(ymin=mpg-ci, ymax=mpg+ci), width=.2,
position=position_dodge(.2)) +
ylim(5, 35) +
ggtitle("Line Plot with Error Bar") +
theme_classic() +
scale_color_brewer(palette="Accent")
นอกจากนี้ การสร้าง error bar ด้วยคำสั่ง geom_errorbar()
ยังสามารถนำไปประยุกต์กับ bar graph ได้เช่นกัน แต่ในกรณีรการสร้าง bargraph จากข้อมูลที่หาค่าสถิติจากคำสั่ง summarySE()
มาแล้วนั้น สังเกตว่าจะมีค่า mean เฉลี่ยแต่ละกลุ่ม (และค่าความคลาดเคลื่อนอื่น ๆ) เท่านั้น ดังนั้นในกรณีนี้เราจะใช้คำสั่ง geom_col()
ในการสร้าง bar graph
bar.error <- ggplot(sum, aes(x = am, y = mpg, color = vs)) +
geom_col(aes(fill = vs), alpha = .5, position = position_dodge(.9)) +
geom_errorbar(aes(ymin=mpg-ci, ymax=mpg+ci), width = .3,
position = position_dodge(.9)) +
theme_classic() +
scale_color_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
bar.error
การสร้างกราฟรูปแบบอื่น ๆ
นอกจาก boxplot, Bar Graph และ Line Graph แล้ว package Ggplot2
ยังช่วยเราในการสร้างกราฟอื่น ๆ ได้ เช่น กราฟที่มีตัวแปรเป็นตัวแปรต่อเนื่อง (continuous variable) เราสามารถใช้คำสั่ง geom_point()
ในการสร้างจุดข้อมูล และ geom_smooth()
ในการหาเส้นตรงที่เหมาะสมระหว่างข้อมูลทั้งสองตัวแปร โดยเพิ่มคำสั่ง geom_smooth(method = lm)
con.point <- ggplot(mtcars, aes(x = hp, y = mpg, color = hp)) +
geom_point(aes(color = hp)) +
geom_smooth(method = lm, color = "darkblue") +
theme_classic()
con.point
เรายังสามารถสร้างข้อมูลเชิงเส้นโดยการใช้คำสั่ง geom_line()
และ geom_jitter()
ในการสร้างกราฟเส้น
con.line <- ggplot(mtcars, aes(x = hp, y = mpg, group = vs)) +
geom_line(color = "blue3", position = position_dodge(.9)) +
geom_jitter(alpha = 0.1, size = 0.5) +
theme_classic()
con.line
การปรับแต่งสีในกราฟ
เราสามารถเลือกปรับแต่งกราฟได้โดยการใช้คำสั่ง theme_
และการใส่สีของกราฟ ทั้ง R
และ Ggplot2
มีระบบสีที่ช่วยให้เราเลือกสี 2 วิธี คือ
-
เราสามารถใส่ชื่อสีที่เราต้องการได้โดยเรียกดูชื่อสีในคำสั่ง
colors()
ซึ่งเป็นคำสั่งจาก Base R หรือ -
คำสั่ง
display.brewer.all()
จาก packageRColorBrewer
colors()
RColorBrewer::display.brewer.all()
Happy Coding ka สามารถกดติดตามและ subscribe ได้ที่ datastist.com
this tutorial was in associated with Psychology Faculty, Chulalongkorn University (Experimental Design And Analysis course)