R-013 ggplot2 và đồ thị
Nội dung bài viết
[Bài này sẽ còn được nhận cập nhật]
Dưới đây là một số hướng dẫn cơ bản dùng ggplot2
. Với mình ggplot2
là một trong những thư viện đồ họa để vẽ đồ thị tốt nhất hiện tại. Triết lý của ggplot2
được gọi là The Grammar of Graphics
mà ở đây chúng ta sẽ không đề cập, bạn đọc quan tâm có thể tìm hiểu thêm.
Trên những tập dữ liệu lớn, bạn nên dùng hàm cung cấp có sẳn R trước rồi sau đó mới dùng ggplot2
, vì hàm có sẳn R chạy nhanh hơn, ggplot
chỉ trong trường hợp bạn muốn xuất ra hình ảnh đẹp mắt để trang trí bài báo cáo.
Ngoài ra trong gói ggplot2
còn có một hàm khá hữu ích là qplot(...)
. Hàm này cho phép vẽ nhanh một số biểu đồ cơ bản với style
mặc định của ggplot2
.
Nạp thư viện ggplot2
từ R-prompt
:
library(ggplot2)
Nhìn chung cú pháp vẽ cơ bản của ggplot2
có dạng như sau ggplot(data=, aes(x=, y=)) + layer thêm vào
.
Để hiểu hơn về ggplot2
bạn có thể xem thêm ggplot2-cheat-sheet (RStudio) hoặc vào ggplot2 tidyverse.
Thử vẽ với tập dữ liệu mpg
có sẳn của ggplot2
nào! Xin chào ggplot2
ggplot(data=mpg, aes(x=hwy, y=cty)) + geom_point()
1. Văn phạm
Khi vẽ và làm việc với ggplot2
các bạn cần chú ý quan trọng đến 3 yếu tố sau:
data: dữ liệu phải là
data.frame
hoặctibble
aesthetics: dữ liệu mà bạn muốn vẽ cột x, y, màu sắc, hình dáng,…
geometry: hình học mà bạn muốn thêm vào biểu đồ points, lines, polygones,…
Lưu ý là mỗi layer thêm vào của ggplot2
hoàn toàn có thể có biến data
và aes
riêng không nhất thiết lấy từ layer gốc.
2. Biểu đồ thanh (Bar Graphs)
Biểu đồ thanh phần lớn được sử dụng khi chúng ta có một biến phân loại, biến còn lại định lượng được trên biến phân loại đó.
Biểu đồ thanh có thể được chia ra làm 2 loại biểu đồ chính:
- Chiều cao của biểu đồ được cung cấp sẳn
- Chiều cao của biểu đồ được đếm từ dữ liệu
Xét tập dữ liệu ToothGrowth (đọc thêm mô tả về tập dữ liệu sinh học này tại đây)
toothgrowth <- ToothGrowth
summary(toothgrowth)
len supp dose
Min. : 4.20 OJ:30 Min. :0.500
1st Qu.:13.07 VC:30 1st Qu.:0.500
Median :19.25 Median :1.000
Mean :18.81 Mean :1.167
3rd Qu.:25.27 3rd Qu.:2.000
Max. :33.90 Max. :2.000
Để vẽ biểu đồ thanh với chiều cao được cung cấp sẳn, ở đây mình vẽ cột dose
theo cột len
, vì sao ở cột x
mình lại chọn factor(dose)
thì tí sẽ nói sau:
ggplot(data=toothgrowth, aes(x=factor(dose), y=len)) + geom_bar(stat="identity")
Vì dose
là biến số học nên R sẽ tự hiểu đây là biến liên tục, nó khiến biểu đồ trở nên xấu. Vì thế ở hàm trên mình để cột x là factor
của x.
ggplot(data=toothgrowth, aes(x=dose, y=len)) + geom_bar(stat="identity")
Có thể tùy chỉnh màu cột lại đẹp hơn, thêm tựa cho cột x và y bằng xlab
và ylab
:
ggplot(data=toothgrowth, aes(x=factor(dose), y=len)) + geom_bar(stat="identity", fill="lightblue") +
xlab(label = "Liều lượng milligrams/ngày") +
ylab(label = "Kích thước răng")
3. Biểu đồ đường (Line Graphs)
Biểu đồ đường phần lớn được sử dụng khi bộ dữ liệu có một biến liên tục và biến còn lại định lượng trên biến liên tục này. Thường thì trục x là một chuổi thời gian (hoặc một tham số thống kê, học máy nào mà tăng dần,…).
Biểu đồ đường có 3 dạng hình học mà bạn đọc cần chú ý:
geom_line
: kết nối các giá trị quan sát được trong dữ liệu, được sắp xếp theo trục x.geom_path
: kết nối các giá trị quan sát được trên sắp xếp gốc (tức là giá trị x sẽ nối với giá trị x lớn liền kề sau đó).geom_step
: tương tự nhưgeom_line
nhưng thay vì vẽ đoạn thẳng thì vẽ hình bậc thang.
Vẽ biểu đồ đường cơ bản:
year <- c(2013,2014,2015,2016,2017,2018)
growth <- c(10,15,17,30,26,39)
my_company <- data.frame(growth, year)
ggplot(data=my_company, aes(x=year, y=growth)) + geom_line() + xlab("Year") + ylab("Growth (%)")
Thử với geom_step
và tách data
và aes
ra từng layer riêng biệt, vẽ thêm một ít điểm để trang trí thêm:
ggplot() +
geom_step(data=my_company, mapping=aes(x=year, y=growth)) +
geom_step(data=my_company, mapping=aes(x=year, y=growth), direction="vh", linetype=3) +
geom_point(data=my_company, mapping=aes(x=year, y=growth), color="red") +
xlab("Year") + ylab("Growth (%)")