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ặc tibble

  • 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 dataaes 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")

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 xlabylab:

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 dataaes 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 (%)")