等高线图
上一篇
仪表盘
下一篇
桑基图
Loading...
等高线图是通过连接地图上相同数值的点得到的闭合曲线图。最常见的是地形图上海拔高度相等的各点所连成的等高线,在等高线上标注的数字为该等高线的海拔高度。等高线按其作用不同,可分为首曲线、计曲线、间曲线与助曲线四种。
除地形图之外,等高线也广泛应用于数据可视化中,用于显示二维平面上的三维数据分布,如温度分布、气压分布、概率密度分布等。等高线一般不相交,但有时可能会重合。在同一等高线上的各点数值相同。在等高线稀疏的地方,数值变化较缓;而在等高线稠密的地方,数值变化较陡。
英文名:Contour Line, Contour Plot
图表类型 | 等高线图 |
---|---|
适合的数据 | 三维数据:两个连续变量(X、Y坐标)和一个数值变量(Z值) |
功能 | 显示二维平面上连续数据的分布模式和数值变化 |
数据与图形的映射 | X坐标映射到横轴位置 Y坐标映射到纵轴位置 Z值通过等高线的层次和标注显示 可选择性地用颜色表示数值大小 |
适合的数据条数 | 连续的二维网格数据,数据点越多,等高线越平滑 |
以下是一个典型的等高线图应用场景:
地形海拔分布图。 下图展示了某山区的海拔高度分布,通过等高线可以直观地看出山峰、山谷和坡度的分布情况。等高线密集的地方表示坡度陡峭,等高线稀疏的地方表示地势平缓。
import { Chart } from '@antv/g2';// 模拟地形高程数据const terrainData = [];for (let x = 0; x <= 50; x += 2) {for (let y = 0; y <= 50; y += 2) {// 模拟山峰地形:两个山峰的高程分布const elevation1 = 100 * Math.exp(-((x - 15) ** 2 + (y - 15) ** 2) / 200);const elevation2 = 80 * Math.exp(-((x - 35) ** 2 + (y - 35) ** 2) / 150);const elevation = elevation1 + elevation2 + 10; // 基础海拔terrainData.push({ x, y, elevation });}}const chart = new Chart({container: 'container',autoFit: true,});chart.options({type: 'cell',data: terrainData,encode: {x: 'x',y: 'y',color: 'elevation',},style: {stroke: '#333',strokeWidth: 0.5,inset: 0.5,},scale: {color: {palette: 'viridis',type: 'sequential',},},legend: {color: {length: 300,layout: { justifyContent: 'center' },labelFormatter: (value) => `${Math.round(value)}m`,},},tooltip: {title: '海拔信息',items: [{ field: 'x', name: '经度' },{ field: 'y', name: '纬度' },{ field: 'elevation', name: '海拔', valueFormatter: (value) => `${Math.round(value)}m` },],},});chart.render();
这个例子展示了:
使用线条绘制等高线轮廓,更接近传统地形图的表现形式。
import { Chart } from '@antv/g2';// 生成等高线数据const generateContourLines = () => {const lines = [];const levels = [20, 40, 60, 80, 100]; // 等高线级别levels.forEach((level, index) => {// 为每个等高线级别生成环形线条const points = [];const centerX = 25;const centerY = 25;const baseRadius = 5 + index * 4;for (let angle = 0; angle <= 360; angle += 5) {const radian = (angle * Math.PI) / 180;const radius = baseRadius + Math.sin(angle * Math.PI / 45) * 2; // 添加一些变化const x = centerX + radius * Math.cos(radian);const y = centerY + radius * Math.sin(radian);points.push({ x, y, level, lineId: `line_${level}` });}lines.push(...points);});return lines;};const contourLines = generateContourLines();const chart = new Chart({container: 'container',autoFit: true,height: 400,});chart.options({type: 'line',data: contourLines,encode: {x: 'x',y: 'y',color: 'level',series: 'lineId',},style: {strokeWidth: 2,strokeOpacity: 0.8,},scale: {color: {type: 'sequential',palette: 'oranges',},x: { nice: true },y: { nice: true },},axis: {x: { title: '距离 (km)' },y: { title: '距离 (km)' },},legend: {color: {title: '海拔高度 (m)',layout: { justifyContent: 'center' },},},tooltip: {title: '等高线信息',items: [{ field: 'level', name: '海拔', valueFormatter: (value) => `${value}m` },],},});chart.render();