Good example of (really) bad charts

2017/08/03

Đã từng gặp phải khá nhiều biểu đồ “xấu” trong các ấn phẩm báo chí, tạp chí, sách in xuất bản tại Việt Nam, nhưng tôi vẫn phải kinh ngạc trước mức độ “tệ” của hai biểu đồ sau đây:

Kinh ngạc không chỉ bởi vì cách tác giả trình bày dữ liệu với biểu đồ, mà còn vì các biểu đồ này thuộc một bài “nghiên cứu khoa học” của hai giáo sư giảng dạy tại khoa thống kê của Đại học Kinh tế quốc dân.

Vậy hai biểu đồ trên tệ ở chỗ nào? Chỉ cần tìm hiểu cơ bản về các nguyên tắc thiết kế data visualization, cũng có thể chỉ ra các lỗi sau:

Với bộ dữ liệu này, tôi nghĩ có nhiều cách để thiết kế, và phương án đầu tiên mà tôi nghĩ tới là small multiples, tương tự như cách làm tham khảo ở đây

library(reshape2)
library(lattice)

dicu <- data.frame(
    region = rep(c("BTB và DH miền Trung", "ĐB sông Hồng", "ĐB sông Cửu Long",
                   "Trung du và MNPB", "Tây Nguyên", "Đông Nam Bộ"), times = 2),
    type = rep(c("Di cư đến", "Di cư đi"), each = 6),
    period_1994_1999 = c(114000, 163000, 67000, 84000, 326000, 580000,
                         425000, 333000, 211000, 180000, 60000, 125000),
    period_2004_2009 = c(110000, 289000, 70000, 91000, 166000, 1635000,
                         775000, 331000, 734000, 271000, 125000, 125000),
    stringsAsFactors = F
)

dicu <- melt(dicu,
             id.vars = c("region", "type"),
             variable.name = "period",
             value.name = "n")
dicu <- within(dicu, period <- gsub("period_", "", period))
dicu <- within(dicu, period <- gsub("_", "-", period))

dotplot(type ~ n | region, data = dicu,
        layout = c(1, 6),
        groups = period,
        pch = c(1, 3),
        col = "black",
        cex = 1.2,
        key = list(space = "right",
                   text = list(c("1994-1999", "2004-2009")),
                   points = list(pch = c(1, 3), col = "black")),
        main = list(label = "Quy mô dân số nhập cư, xuất cư các vùng,\nso sánh 1994-1999 và 2004-2009",
                    cex = 1),
        xlab = NULL,
        par.settings = list(grid.pars = list(fontfamily = "Lato")))