Tạo bản đồ với ggplot2

Tác giả: Hoàng Đức Anh | 2018-11-01

Giới thiệu

Khi phân tích dữ liệu, xây dựng bản đồ là một trong những công cụ rất mạnh giúp cho việc trực quan hóa, đặc biệt trong lĩnh vực kinh doanh, marketing. Việc xây dựng bản đồ giúp truyền tài kết quả phân tích một cách nhanh chóng và hiệu quả.

Với cách làm truyền thống, việc xây dựng bản đồ là không hề dễ dàng. Các packages như sp, sf hay tmap đều rất mạnh trong vẽ biểu đồ. Tuy nhiên, các packages này đều chưa thực sự tương thích với hệ sinh thái của tidyverse. Tuy nhiên, với ggplot2 phiên bản từ 2.3 trở lên, việc xây dựng biểu đồ được thực hiện khá rất dễ dàng với sự tương thích của tidyverse.

Trong bài viết này, Ranalytics sẽ hướng dẫn các bạn vẽ biểu đồ Việt Nam một cách đơn giản.


Bước 1: Load dữ liệu địa lý

Để dọc dữ liệu địa lý định dang .shp, ta sử dụng package sf với hàm st_read. Dữ liệu về bản đồ Việt Nam được Ranalytics chuẩn bị ở đường link sau [https://github.com/anhhd/data/VNM_adm]

library(tidyverse)
library(sf)
vn <- st_read("VNM_adm/VNM_adm1.shp")
vn %>% class
## Reading layer `VNM_adm1' from data source `E:\01.GitHub\Ranalytics.vn\static\data\VNM_adm\VNM_adm1.shp' using driver `ESRI Shapefile'
## Simple feature collection with 63 features and 9 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 102.145 ymin: 8.563332 xmax: 109.4694 ymax: 23.39273
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
## [1] "sf"         "data.frame"

Bước 2: Trực quan hóa biểu đồ

Như chúng ta thấy, dữ liệu có định dang sfdata.frame. Với ggplot2 từ 2.3, ta có thể trực quan hóa object sf như sau

theme_set(
  theme_minimal() +
  theme(axis.line = element_blank(), 
        axis.text = element_blank(),
        axis.ticks = element_blank(), 
        axis.title = element_blank()))

vn %>% 
  ggplot() +
  geom_sf(aes(fill = NAME_1)) +
  theme(legend.position = "none") 


Bước 3: Tạo biểu đồ nhiệt

Với định dạng sf, ta hoàn toàn có thể tạo thêm biến mới thể hiện doanh số bán hàng hoặc lượng dân cư và thể hiện dưới dạng biểu đồ nhiệt như sau.

#Tạo thêm biến sale
df <- vn %>% mutate(sale = runif(63, 1, 10))
df %>% names
##  [1] "ID_0"      "ISO"       "NAME_0"    "ID_1"      "NAME_1"   
##  [6] "TYPE_1"    "ENGTYPE_1" "NL_NAME_1" "VARNAME_1" "sale"     
## [11] "geometry"
df %>% 
  ggplot() +
  geom_sf(aes(fill = sale)) +
  scale_fill_viridis_c()


Tạo biểu đồ với cấp quận, thành phố

# Load biểu đồ cấp quận huyện
vn2 <- st_read("VNM_adm/VNM_adm2.shp")
## Reading layer `VNM_adm2' from data source `E:\01.GitHub\Ranalytics.vn\static\data\VNM_adm\VNM_adm2.shp' using driver `ESRI Shapefile'
## Simple feature collection with 678 features and 11 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: 102.145 ymin: 8.563332 xmax: 109.4694 ymax: 23.39273
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
# Lọc biểu đồ với 1 tỉnh
vn2 %>% 
  filter(NAME_1 == "Yên Bái") %>% 
  # Tạo thêm doanh số bán hàng
  mutate(sale = runif(nrow(.), 1, 10)) %>% 
  ggplot() +
  geom_sf(aes(fill = sale)) +
  geom_sf_text(aes(label = VARNAME_2)) +
  scale_fill_viridis_c() +
  labs(title = "Volume of Vodka in Yen Bai in 2018",
       caption = "Created by Ranalytics.vn")


Như vậy chúng ta đã học được cách xây dựng biểu đồ cơ bản với ggplot2. Chúc các bạn làm việc hiệu quả với Ranalytics.vn

comments powered by Disqus