Biểu đồ chorolepth nghe có vẻ lạ lẫm, nhưng thực ra khái niệm của nó rất đơn giản. Tôi dịch và rút gọn đoạn giới thiệu sau từ trang wiki tiếng Anh:
Bản đồ chorolepth (từ tiếng Hy Lạp χῶρος “khu vực/vùng” và πλῆθος “số lượng”) là một loại địa đồ trong đó các khu vực được đổ bóng hoặc thêm hoạ tiết tương đương với giá trị của một biến số thống kê. Biến số này đại diện cho một tóm tắt tổng hợp về một đặc điểm địa lý trong mỗi khu vực, ví dụ như mật độ dân số hay thu nhập trên đầu người.
Tôi rất thích loại biểu đồ chorolepth này, vì nó rất trực quan. Ai nhìn vào một cái biểu đồ chorolepth đều sẽ hiểu nội dung của nó ngay. Điều này không phải vì chorolepth minh hoạ số liệu khéo léo hay tài tình gì, mà vì thực ra nó là một trong những loại biểu đồ cơ bản nhất! Chúng ta sử dụng màu sắc để biểu diễn các loại số liệu - categorical hay continuous - và nếu số liệu đó đại diện cho đặc điểm của các khu vực địa lý, thì chúng ta đổ màu lên một cái bản đồ thôi? Tiếc rằng, thời nay, khi mà tư duy về minh họa số liệu của chúng ta gắn liền với các phần mềm văn phòng như Word và Excel, người ta cứ quen tay sử dụng biểu đồ cột (column chart) hay biểu đồ đường (line chart) để minh hoạ số liệu của các khu vực địa lý khác nhau. Đó là một bước đi lùi. Đồ thị dạng cột không thể nào thay thế cho chorolepth được.
Muốn biểu diễn số liệu sao cho hiệu quả, chúng ta cần biết sử dụng các loại đồ thị căn bản nhất. Vì vậy, trong bài này, tôi giới thiệu về cách vẽ một biểu đồ chorolepth cho Việt Nam, sử dụng ngôn ngữ lập trình R. Các ngôn ngữ hay phần mềm thống kê khác cũng đi qua những bước tương tự như vậy thôi, nhưng sử dụng một ngôn ngữ lập trình đa năng như R thì minh bạch hơn một chút về logic.
Muốn vẽ một cái chorolepth map, chúng ta cần 2 loại dữ liệu:
- Dữ liệu về hình dạng khu vực địa lý mà ta muốn vẽ (shapefile). Cụ thể, các đơn vị hành chính có hình khối như nào? Đường biên góc cạnh ra sao? Tiếp giáp với nhau từ đâu đến đâu? Ở đây, tôi dùng shapefile đơn vị hành chính Việt Nam đến mức độ quận/huyện, lấy ở đây.
- Thông tin mà chúng ta muốn biểu diễn, trong bài ví dụ này, tôi sẽ đổ màu cho 63 tỉnh/thành Việt Nam theo diện tích của từng tỉnh, số liệu về diện tích này cũng có sẵn trong shapefile ở trên.
1 Làm quen với shapefile trong R
Trước tiên, chúng ta gọi các gói cần thiết:
library(rgdal) #Bindings for the 'Geospatial' Data Abstraction Library
Gói rgdal
cho chúng ta tương tác với các số liệu dạng shapefile trong R. Tiếp đó, chúng ta nhập số liệu, sử dụng hàm readOGR()
trong gói này:
## giải nén file .zip, điều này có thể thực hiện bên ngoài R
system("unzip vnm_adm_gov_20200103_shp.zip")
## đưa dữ liệu bản đồ vào trong R bằng hàm readOGR
vn_spdf <- readOGR("vnm_admbnda_adm1_gov_20200103.shp")
Bạn để ý tên shapefile mà tôi đọc vào: vnm_admbnda_adm1_gov_20200103.shp
. Trong tên file có đoạn adm1
, tức đây là shapefile đến đơn vị từng tỉnh. nếu tôi đọc file có chứa adm2
sẽ được dữ liệu bản đồ đến đơn vị từng quận, huyện.
Bây giờ chúng ta đã có object vn_spdf
thuộc lớp SpatialPolygonsDataFrame
. Để vẽ đồ thị sử dụng lớp này, đơn giản chỉ cần dùng hàm plot()
:
plot(vn_spdf) #vẽ đồ thị
2 Đổ màu vào bản đồ
Để tô màu vào biểu đồ, tôi sử dụng thêm gói viridis
. Thực ra gói viridis
không phải là bắt buộc. Tôi sử dụng vì nó cho chúng ta bảng màu đẹp và dễ nhìn hơn các bảng màu có sẵn trong R.
library(viridis)
Đầu tiên chúng ta tạo một véc-tơ màu tương ứng với từng tỉnh/thành phố:
n_cut <- 100 #Số nhóm màu là 100
## Tạo danh sách 100 màu sử dụng bảng màu viridis
my_colors <- viridis(n_cut)
## Chia véc tơ diện tích (my_spdf@data$Shape_Area) thành 100 nhóm
color_groups <- cut(my_spdf@data$Shape_Area, n_cut)
my_colors <- my_colors[as.numeric(color_groups)]
Để vẽ bản đồ sử dụng danh sách màu chúng ta vừa tạo với biến my_colors
, chỉ cần viết hàm plot()
như sau:
## Vẽ chorolepth, sử dụng bảng màu trên
plot(my_spdf, col=my_colors)
Không quá khó, phải không?