Bản đồ choropleth là loại bản đồ chuyên đề phổ biến nhất mà bạn sẽ thấy trên báo, trong các báo cáo chính sách, và trên dashboard công ty. Nếu bạn từng nhìn vào một bản đồ bầu cử tô theo margin, một bản đồ COVID tô theo tỷ lệ ca bệnh, hay một bản đồ GDP tô theo thu nhập, bạn đã đọc một bản đồ choropleth.
Bài hướng dẫn này giải thích bản đồ choropleth là gì, khi nào dùng, các lỗi phổ biến nhất, và cách xây dựng một bản đồ choropleth production với vector tile API.
Định nghĩa một câu
Bản đồ choropleth tô màu mỗi vùng của bản đồ theo một giá trị số duy nhất được đo cho vùng đó, sử dụng thang màu mã hóa độ lớn.
Từ này xuất phát từ tiếng Hy Lạp khoros (vùng) và plethos (đa số). Nó có từ thời các nhà thống kê Pháp những năm 1820 và từ đó đã là trụ cột của thematic cartography.
Ví dụ bản đồ choropleth
Một số cách dùng kinh điển:
- Mật độ dân số theo quốc gia, tỉnh, hoặc mã bưu chính
- Kết quả bầu cử theo quận, với cường độ màu cho thấy margin chiến thắng
- GDP bình quân đầu người theo quốc gia, thường dùng thang logarithmic
- Tỷ lệ thất nghiệp theo vùng
- Tỷ lệ ca COVID trên 100.000 cư dân theo quận
- Giá bất động sản trung bình theo khu phố
- Tỷ lệ broadband theo khu điều tra dân số
- Năng suất cây trồng theo vùng nông nghiệp
Đặc điểm chung là dữ liệu chỉ là một con số cho mỗi vùng đã được định nghĩa trước.
Bản đồ choropleth vs heat map
Hai loại này thường bị nhầm lẫn. Sự khác biệt rất quan trọng.
Bản đồ choropleth cần các vùng được định nghĩa trước. Dữ liệu đã được tổng hợp. Mỗi vùng nhận một màu. Các ranh giới là một phần của thông điệp.
Heat map cần dữ liệu điểm. Mật độ được tính bằng binning hoặc kernel smoothing. Đầu ra là gradient liên tục bỏ qua ranh giới hành chính. Dùng nó cho việc phát hiện cluster, không phải so sánh vùng.
Nếu bạn có một con số cho mỗi mã bưu chính, dùng choropleth. Nếu bạn có một đám ping GPS, dùng heat map.
Cách bản đồ choropleth được xây dựng
Ba thành phần:
- Hình học ranh giới. Một tập polygon GeoJSON (hoặc lớp vector tile) cho các vùng bạn muốn tô màu, mỗi vùng có một identifier ổn định (ví dụ mã quốc gia ISO, FIPS bang Mỹ, mã NUTS EU, mã bưu chính).
- Một giá trị dữ liệu cho mỗi vùng. Một object JSON đơn giản hoặc CSV được key bằng cùng identifier.
- Một renderer kết hợp chúng. Các thư viện web mapping hiện đại (MapLibre GL, Mapbox GL, deck.gl, OpenLayers) có thể join dữ liệu với ranh giới ở runtime bằng feature-state hoặc property expression.
Đây là pattern khái niệm trong MapLibre GL JS:
map.addSource('regions', {
type: 'vector',
url: 'https://api.mapatlas.xyz/v1/tiles/regions.json',
});
map.addLayer({
id: 'regions-fill',
type: 'fill',
source: 'regions',
'source-layer': 'regions',
paint: {
'fill-color': [
'interpolate',
['linear'],
['feature-state', 'value'],
0, '#f7fbff',
50, '#6baed6',
100, '#08306b',
],
'fill-opacity': 0.8,
},
});
// Push your data to each feature at runtime
for (const [regionId, value] of Object.entries(yourData)) {
map.setFeatureState(
{ source: 'regions', sourceLayer: 'regions', id: regionId },
{ value }
);
}
Bản đồ fetch boundary tile một lần và re-style chúng khi dữ liệu của bạn thay đổi. Không cần re-rendering server-side.
Chọn thang màu đúng
Ba quy tắc:
Sequential cho dữ liệu một chiều. Sáng đến tối trong một hue. Dùng cho các đại lượng đi từ thấp đến cao mà không có midpoint có ý nghĩa (dân số, thu nhập, tỷ lệ).
Diverging cho dữ liệu hai chiều. Một midpoint trung tính và hai hue tỏa ra (đỏ và xanh, nâu và teal). Dùng khi số không hoặc trung bình có ý nghĩa và các giá trị có thể nằm ở cả hai phía (tăng trưởng year-over-year, margin bầu cử, độ lệch so với mean).
Tránh thang rainbow. Chúng ngụ ý một thứ tự mà cảm nhận của con người không khớp đồng đều. Chúng cũng thất bại với người xem mù màu. ColorBrewer (colorbrewer2.org) là chuẩn được kartograph kiểm chứng cho palette choropleth.
Một lỗi phổ biến là dùng quá nhiều bin. Năm đến bảy là sweet spot. Nhiều hơn nữa và người đọc không thể phân biệt các shade liền kề.
Câu hỏi phân loại
Một khi bạn có thang, bạn phải quyết định nơi vẽ ranh giới bin:
- Equal interval. Chia range thành các phần đều. Hoạt động với dữ liệu phân bố đều, thất bại khi có outlier.
- Quantile. Mỗi bin chứa cùng số lượng vùng. Hữu ích khi bạn muốn mọi shade đều hiển thị, nhưng có thể che giấu độ lớn của khác biệt.
- Natural breaks (Jenks). Tối thiểu hóa variance trong bin. Default data-driven nhất.
- Manual. Khi ranh giới bin mang ý nghĩa (ví dụ tax bracket, ngưỡng nhân khẩu học).
Lựa chọn có tác động thực sự đến câu chuyện mà bản đồ kể. Hãy publish phương pháp phân loại trong bất kỳ báo cáo nghiêm túc nào.
Các pitfall phổ biến
Area bias. Vùng lớn, mật độ thấp thống trị bản đồ về mặt thị giác. Một choropleth kết quả bầu cử tổng thống Mỹ tô theo margin sẽ trông chủ yếu là đỏ vì các quận nông thôn rất lớn. Cartogram hoặc bản đồ dot-density khắc phục điều này.
Số đếm thô thay vì tỷ lệ. Một bản đồ "ca COVID mỗi bang" chủ yếu là một bản đồ dân số. Luôn chuẩn hóa theo dân số, diện tích, hoặc denominator khác trừ khi số tuyệt đối là điều bạn muốn truyền tải.
Thang gây hiểu lầm. Thang quantile làm mọi bản đồ trông thú vị ngay cả khi spread thực sự nhỏ. Thang equal-interval làm mọi bản đồ trông phẳng khi có outlier. Hãy khớp phân loại với câu hỏi.
Dữ liệu thiếu. Quyết định trước liệu một vùng không có dữ liệu sẽ hiển thị xám, bị bỏ qua, hay tô màu giống như số không. Mỗi lựa chọn thay đổi cách đọc.
Khi nào chọn biểu đồ khác
Nếu dữ liệu của bạn multivariate cho mỗi vùng, choropleth sẽ làm phẳng nó. Cân nhắc:
- Small multiples. Một grid các bản đồ choropleth, mỗi biến một bản đồ.
- Bivariate choropleth. Hai biến mã hóa thành lưới màu 2D. Khó đọc nhưng mạnh khi hoạt động.
- Cartogram. Bóp méo kích thước vùng theo giá trị, hữu ích khi area bias thống trị.
- Biểu đồ thanh trên bản đồ. Đôi khi dữ liệu chỉ là một bảng; bản đồ là trang trí.
Cartography là giao tiếp. Choropleth chỉ là một công cụ trong nhiều công cụ.
MapAtlas phù hợp ở đâu
Dynamic Maps API cung cấp các nguồn vector tile cho ranh giới quốc gia, vùng và mã bưu chính mà bạn có thể style ở runtime với dữ liệu của riêng mình, đúng như trong snippet MapLibre ở trên. Các ranh giới được host tại EU, đánh dấu phiên bản, và được thiết kế để join sạch với các identifier chuẩn (ISO 3166, NUTS, các hệ thống mã bưu chính quốc gia).
Cho các trang cần hiển thị thống kê tổng hợp theo vùng (giá bất động sản theo mã bưu chính, chi phí delivery theo vùng, doanh số theo territory) GeoEnrich API trả về các giá trị mỗi vùng được key cùng boundary ID, nên cùng một join hoạt động cho cả bản đồ và bảng của bạn. Toàn bộ background thematic-map được trình bày trong Thematic Map Guide.
Câu hỏi thường gặp
Bản đồ choropleth là gì?
Bản đồ choropleth là một loại bản đồ chuyên đề trong đó các vùng địa lý (quốc gia, tỉnh, mã bưu chính, khu điều tra dân số) được tô màu hoặc đổ bóng theo tỷ lệ một biến thống kê được đo cho từng vùng. Cường độ màu mã hóa giá trị, nên màu đậm hơn thường nghĩa là giá trị cao hơn còn màu nhạt hơn là thấp hơn. Bản đồ choropleth là cách tiêu chuẩn để hiển thị mật độ dân số, kết quả bầu cử, GDP bình quân đầu người, tỷ lệ thất nghiệp, và bất kỳ đại lượng nào được tổng hợp tự nhiên theo ranh giới hành chính.
Khác biệt giữa bản đồ choropleth và heat map là gì?
Bản đồ choropleth tô màu các vùng đã được định nghĩa sẵn (quốc gia, mã bưu chính, quận) dựa trên giá trị tổng hợp cho từng vùng. Heat map hiển thị cường độ dữ liệu điểm liên tục trên không gian, không tôn trọng ranh giới hành chính. Dùng choropleth khi dữ liệu của bạn đã được tổng hợp theo vùng (ví dụ phiếu bầu mỗi tỉnh, doanh số mỗi mã bưu chính). Dùng heat map khi dữ liệu của bạn là một đám điểm và bạn muốn xem chúng tập trung ở đâu (ví dụ các vụ phạm tội, pin khách hàng, dữ liệu cảm biến).
Khi nào tôi nên dùng bản đồ choropleth?
Dùng bản đồ choropleth khi dữ liệu của bạn là một giá trị số duy nhất cho mỗi vùng và các vùng có kích thước tương đối tương đương hoặc bạn có thể chuẩn hóa theo diện tích hoặc dân số. Ví dụ tốt: tỷ lệ hộ gia đình có broadband theo quận, ca COVID trên 100k người theo vùng, giá thuê trung bình theo mã bưu chính. Tránh choropleth khi các vùng có diện tích chênh lệch lớn (vùng nông thôn rộng lớn sẽ thống trị về mặt thị giác dù dân số ít), hoặc khi bạn có nhiều biến cho mỗi vùng (dùng small multiples hoặc loại biểu đồ khác).
Làm thế nào để xây dựng bản đồ choropleth?
Bạn cần ba thứ: hình học ranh giới cho các vùng (polygon GeoJSON), giá trị dữ liệu cho mỗi vùng được key bằng ID ổn định, và một renderer kết hợp cả hai và áp dụng thang màu. Các stack phổ biến: MapLibre GL hoặc Mapbox GL với fill-color expression, deck.gl GeoJsonLayer với getFillColor, D3.js với d3-geo cho SVG tĩnh, hoặc một dynamic map API được hosted. MapAtlas Dynamic Maps API cung cấp boundary tile cho quốc gia, vùng và mã bưu chính mà bạn có thể style ở runtime với dữ liệu của mình.
Thang màu tốt cho bản đồ choropleth là gì?
Dùng thang sequential một hue (ví dụ xanh nhạt đến xanh đậm) khi dữ liệu là một đại lượng duy nhất có số không tự nhiên. Dùng thang diverging hai hue (ví dụ đỏ tới trắng tới xanh) khi giá trị phân kỳ quanh một điểm giữa có ý nghĩa (margin bầu cử, thay đổi year-over-year). Tránh thang rainbow: chúng ngụ ý một thứ tự mà con người không cảm nhận đồng đều và thất bại với người mù màu. ColorBrewer là tham chiếu chuẩn cho các palette đã được kartograph kiểm chứng.

