Đã 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:
không có title, không rõ tác muốn nói đến chủ đề gì?
không có source, không rõ tác giả lấy dữ liệu từ nguồn nào?
sử dụng màu sắc tùy tiện để encode data, legend chỉ có 2 nhóm là Di cư đến và Di cư đi nhưng có tới 8 màu đuợc sử dụng (tôi sẽ lấy biểu đồ này để làm ví dụ minh họa cho nguyên tắc chọn màu sắc của Edward Tufte: Above all, do no harm)
phương pháp thiết kế biểu đồ sai, so sánh dữ liệu của 2 giai đọan nhưng lại không đặt cùng trong một biểu đồ với thang đo (yaxis scale) nhất quán, nên việc sử dụng đồ họa không còn giá trị do không thể so sánh.
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")))