HAHS.
Back to Catalog

Cartogram

chart

Also known as: area cartogram, distorted map, value-by-area map, Dorling cartogram

Show distributionCompareShow geographic pattern GeographicalNumerical Map/Spatial

설명 / Description

카토그램은 각 지역의 면적이 실제 땅 넓이가 아니라 인구, GDP, 득표수 같은 데이터 변수에 비례하도록 지리적 지역의 형태를 왜곡합니다. 그 결과 시각적으로 큰 지역이 큰 값을 나타내는 지도가 만들어지며, 이는 코로플레스 맵의 가장 흔한 문제 — 지역의 시각적 두드러짐이 데이터의 중요성이 아니라 물리적 크기를 반영한다는 점 — 를 직접적으로 상쇄합니다.

A cartogram distorts the geometry of geographic regions so that the area of each region is proportional to a data variable (such as population, GDP, or number of votes) rather than physical land area. The result is a map where visually large regions represent large values, directly counteracting the most common problem with choropleth maps: that the visual prominence of a region reflects its physical size, not its data importance.

왜곡의 정도는 미묘한 수준(인접성을 유지하면서 경계를 왜곡하는 연속형 카토그램)부터 급진적인 수준(지역을 겹치지 않는 원으로 대체하는 돌링 카토그램)까지 다양합니다. 이 양극단 사이에는 여러 알고리즘 기반 접근법이 있습니다: 확산 기반 카토그램은 지역을 부드럽게 팽창시키거나 수축시키고, 고무판 방식은 연속적인 표면을 늘리며, 그리드/타일 카토그램은 지역을 균일한 정사각형이나 육각형의 규칙적인 격자에 맞춥니다.

The distortion can range from subtle (contiguous cartograms that warp boundaries while maintaining adjacency) to radical (Dorling cartograms that replace regions with non-overlapping circles). Between these extremes lie several algorithmic approaches: diffusion-based cartograms smoothly inflate or deflate regions, rubber-sheet methods stretch a continuous surface, and grid/tile cartograms snap regions to a regular grid of uniform squares or hexagons.

카토그램은 물리적 면적과 데이터 크기 사이의 불일치가 일반 지도에서 오해를 불러일으킬 때 가장 강력합니다. 선거 지도가 전형적인 예입니다: 코로플레스 맵에서는 인구밀도가 낮은 농촌 지역이 시각적으로 지배적인 반면, 인구밀도가 높은 도시는 작게 표시됩니다. 인구 가중 카토그램은 유권자 한 명 한 명을 동등하게 보이게 함으로써 이를 바로잡아 데이터를 더 정직하게 나타내는 지도를 만듭니다.

Cartograms are most powerful when the mismatch between physical area and data magnitude creates misleading impressions in standard maps. Election maps are the classic example: in a choropleth, sparsely populated rural areas dominate visually, while densely populated cities are tiny. A population-weighted cartogram corrects this by making each voter equally visible, producing a map that more honestly represents the data.

Cartogram — interactive example (Dorling-style)

언제 사용하나 / When to Use

  • 넓지만 인구밀도가 낮은 지역이 지배적으로 보이는 코로플레스 맵의 시각적 왜곡을 바로잡을 때
  • Correcting the visual distortion of choropleths where large but sparsely populated regions dominate
  • 인구 가중 데이터(선거 결과, 인구당 질병 유병률)를 보여줄 때
  • Showing population-weighted data (election results, disease prevalence per capita)
  • 측정 단위(사람, 달러, 표) 하나하나를 지도 위에 동등하게 보이게 할 때
  • Making every unit of measurement (person, dollar, vote) equally visible on a map
  • 언론 보도나 저널리즘 스토리텔링을 위해 기억에 남는 강렬한 시각화를 만들 때
  • Creating memorable, striking visualizations for editorial or journalistic storytelling

이럴 땐 피하세요 / When NOT to Use

  • 지리적 형태와 위치가 정확하게 보존되어야 할 때 -- 코로플레스 맵이나 버블 맵을 사용하세요
  • When geographic shape and location must be preserved accurately -- use a choropleth or bubble map
  • 청중이 해당 지리에 익숙하지 않을 때 -- 왜곡으로 인해 낯선 지역을 알아볼 수 없게 됩니다
  • When the audience is unfamiliar with the geography -- distortion makes unfamiliar regions unrecognizable
  • 정확한 공간 패턴(군집, 인접성)이 핵심일 때 -- 왜곡이 공간적 관계를 무너뜨립니다
  • When precise spatial patterns (clustering, proximity) are the focus -- distortion destroys spatial relationships
  • 데이터 변수가 물리적 면적과 강하게 상관관계를 가질 때 -- 카토그램이 일반 지도와 거의 동일하게 보이게 됩니다
  • When the data variable correlates strongly with physical area -- the cartogram will look nearly identical to a regular map
  • 매우 작은 지역이 아주 많을 때 -- 너무 작아져서 보거나 상호작용하기 어려워질 수 있습니다
  • When there are very many small regions -- they may become too tiny to see or interact with

구조 / Anatomy

  • 왜곡된 지역: 시각적 면적이 데이터 변수에 비례하도록 크기가 조정된 지리적 영역
  • Distorted regions: Geographic areas resized so that their visual area is proportional to the data variable
  • 인접성 보존: 연속형 카토그램은 어떤 지역이 서로 인접해 있는지를 유지하려 시도합니다
  • Adjacency preservation: Contiguous cartograms attempt to maintain which regions border each other
  • 형태 보존: 원래의 지리적 형태를 얼마나 알아볼 수 있는지는 알고리즘에 따라 다릅니다
  • Shape preservation: The degree to which original geographic shapes are recognizable varies by algorithm
  • 색상 인코딩: 채우기 색상은 보통 두 번째 변수(예: 정당, 성장률)를 인코딩합니다
  • Color encoding: Fill color typically encodes a second variable (e.g., party affiliation, growth rate)
  • 레이블: 각 도형 안이나 근처에 배치된 지역 이름 또는 약어
  • Labels: Region names or abbreviations placed inside or near each shape
  • 범례: 면적에서 데이터 값으로의 매핑을 보여주는 크기 범례, 해당 시 색상 범례도 함께
  • Legend: A size legend showing the mapping from area to data value, plus a color legend if applicable

변형 / Variations

  • 연속형 카토그램(가스트너-뉴먼): 공유 경계를 유지하면서 지역을 부드럽게 왜곡하여 지리적 식별 가능성을 최대화합니다
  • Contiguous cartogram (Gastner-Newman): Regions are smoothly warped while maintaining shared borders; maximizes geographic recognizability
  • 돌링 카토그램: 각 지역을 데이터 변수에 따라 크기가 정해진, 겹치지 않는 원으로 대체합니다. 명료함을 위해 지리 정보를 희생합니다
  • Dorling cartogram: Each region is replaced by a non-overlapping circle sized by the data variable; sacrifices geography for clarity
  • 드메어 카토그램: 돌링과 유사하지만 원 대신 정사각형을 사용하여 레이블 배치가 더 좋습니다
  • Demers cartogram: Like Dorling but uses squares instead of circles, with better label placement
  • 타일 그리드 맵(헥스 카토그램): 각 지역이 격자 위의 균일한 육각형이나 정사각형입니다. 일관된 크기와 쉬운 레이블링을 위해 비례성을 희생합니다
  • Tile grid map (hex cartogram): Each region is a uniform hexagon or square on a grid; sacrifices proportionality for consistent sizing and easy labeling
  • 비연속형 카토그램: 지역이 형태는 유지하지만 크기가 조정되고 위치가 재배치되어 지역 사이에 틈이 생깁니다
  • Non-contiguous cartogram: Regions maintain their shape but are scaled and repositioned, creating gaps between them

코드 레퍼런스 / Code Reference

// D3 Dorling cartogram using force simulation
import * as d3 from "d3";

const r = d3.scaleSqrt()
  .domain([0, d3.max(data, d => d.population)])
  .range([5, 50]);

const simulation = d3.forceSimulation(data)
  .force("x", d3.forceX(d => projection([d.lon, d.lat])[0]))
  .force("y", d3.forceY(d => projection([d.lon, d.lat])[1]))
  .force("collide", d3.forceCollide(d => r(d.population) + 1));

svg.selectAll("circle")
  .data(data).join("circle")
  .attr("r", d => r(d.population))
  .attr("fill", d => color(d.party));