热力图 (Heatmap)

 前端   小卒子   2024-10-12 22:08   1116

ECharts 热力图:展示数据密度和趋势

热力图(Heatmap)是一种常用于展示数据密度、分布和趋势的图表。它通过不同的颜色深浅来表示数值大小,常用于数据的地理分布、矩阵数据展示、时间序列等场景。ECharts 提供了强大的热力图功能,能够支持自定义色阶、渐变效果及数据映射。

本文将详细介绍如何使用 ECharts 绘制热力图,涵盖基础配置、色阶与渐变效果的设置以及结合其他组件的高级用法。文章提供了大量示例代码,便于读者理解和实践。

一、热力图的基础结构

热力图的核心是在一个二维区域内,将数据点的值通过颜色的深浅进行映射,展现不同区域数据的密度与趋势。在 ECharts 中,热力图通过 series 中的 type 来定义为 "heatmap" 类型。

1. 热力图的基本配置结构

var option = {
    tooltip: {
        position: 'top',
        formatter: function (params) {
            return `X: ${params.value[0]}, Y: ${params.value[1]}<br/>Value: ${params.value[2]}`;
        }
    },
    animation: false,
    xAxis: {
        type: 'category',
        data: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
        splitArea: {
            show: true
        }
    },
    yAxis: {
        type: 'category',
        data: ['1', '2', '3', '4', '5', '6', '7'],
        splitArea: {
            show: true
        }
    },
    visualMap: {
        min: 0,
        max: 100,
        calculable: true,
        orient: 'horizontal',
        left: 'center',
        bottom: '15%',
        inRange: {
            color: ['#50a3ba', '#eac736', '#d94e5d']
        }
    },
    series: [{
        name: '热力图',
        type: 'heatmap',
        data: [[0, 0, 50], [1, 1, 80], [2, 2, 100], [3, 3, 60]],
        label: {
            show: true
        },
        emphasis: {
            itemStyle: {
                shadowBlur: 10,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
            }
        }
    }]
};

在这个配置中:

  • xAxisyAxis 定义了横纵坐标轴。通过 category 类型可以将其转化为类别轴,并根据数据填充坐标点。
  • visualMap 是热力图的核心部分,用于将数据值映射到特定颜色上。通过 minmax 定义数据值范围,并通过 inRange.color 设置渐变颜色。
  • series 中的 data 则包含热力图的主要数据。每个数据点是一个包含三个值的数组,表示 x 坐标、y 坐标和数据值。

二、绘制基础热力图

下面我们将演示如何使用 ECharts 绘制一个简单的热力图。

1. HTML 结构

首先,定义一个用于展示热力图的 div 容器:

<div id="heatmapChart" style="width: 800px; height: 600px;"></div>

2. 热力图的 JavaScript 配置

接下来,使用 JavaScript 代码生成热力图:

var heatmapChart = echarts.init(document.getElementById('heatmapChart'));

var heatmapOption = {
    tooltip: {
        position: 'top',
        formatter: function (params) {
            return `X: ${params.value[0]}, Y: ${params.value[1]}<br/>Value: ${params.value[2]}`;
        }
    },
    xAxis: {
        type: 'category',
        data: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
        splitArea: {
            show: true
        }
    },
    yAxis: {
        type: 'category',
        data: ['1', '2', '3', '4', '5', '6', '7'],
        splitArea: {
            show: true
        }
    },
    visualMap: {
        min: 0,
        max: 100,
        calculable: true,
        orient: 'horizontal',
        left: 'center',
        bottom: '15%',
        inRange: {
            color: ['#50a3ba', '#eac736', '#d94e5d']
        }
    },
    series: [{
        name: '热力图',
        type: 'heatmap',
        data: [
            [0, 0, 50], [0, 1, 70], [0, 2, 80],
            [1, 0, 90], [1, 1, 60], [1, 2, 30],
            [2, 0, 100], [2, 1, 50], [2, 2, 40]
        ],
        label: {
            show: true
        },
        emphasis: {
            itemStyle: {
                shadowBlur: 10,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
            }
        }
    }]
};

heatmapChart.setOption(heatmapOption);

3. 完整的 HTML 示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ECharts 热力图示例</title>
    <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
</head>
<body>
    <h1>ECharts 热力图示例</h1>
    <div id="heatmapChart" style="width: 800px; height: 600px;"></div>

    <script>
        var heatmapChart = echarts.init(document.getElementById('heatmapChart'));

        var heatmapOption = {
            tooltip: {
                position: 'top',
                formatter: function (params) {
                    return `X: ${params.value[0]}, Y: ${params.value[1]}<br/>Value: ${params.value[2]}`;
                }
            },
            xAxis: {
                type: 'category',
                data: ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
                splitArea: {
                    show: true
                }
            },
            yAxis: {
                type: 'category',
                data: ['1', '2', '3', '4', '5', '6', '7'],
                splitArea: {
                    show: true
                }
            },
            visualMap: {
                min: 0,
                max: 100,
                calculable: true,
                orient: 'horizontal',
                left: 'center',
                bottom: '15%',
                inRange: {
                    color: ['#50a3ba', '#eac736', '#d94e5d']
                }
            },
            series: [{
                name: '热力图',
                type: 'heatmap',
                data: [
                    [0, 0, 50], [0, 1, 70], [0, 2, 80],
                    [1, 0, 90], [1, 1, 60], [1, 2, 30],
                    [2, 0, 100], [2, 1, 50], [2, 2, 40]
                ],
                label: {
                    show: true
                },
                emphasis: {
                    itemStyle: {
                        shadowBlur: 10,
                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                    }
                }
            }]
        };

        heatmapChart.setOption(heatmapOption);
    </script>
</body>
</html>

三、理解色阶、渐变和数据映射

在热力图中,色阶和渐变是核心部分。visualMap 组件用来控制数据值到颜色的映射。

1. 色阶的定义

visualMap 中,我们可以通过 minmax 来定义数据的范围,同时 inRange 可以设置颜色的变化范围。

visualMap: {
    min: 0,
    max: 100,
    inRange: {
        color: ['#50a3ba', '#eac736', '#d94e5d']
    }
}

这段代码的意思是将数据从 0 到 100 映射为 #50a3ba#d94e5d 的颜色渐变。

2. 控制渐变效果

通过 inRangecolor 属性,可以定义颜色的渐变效果。比如,我们可以使用三种颜色来构建

渐变效果,表示低值到高值的颜色变化。

3. 数据映射与交互

ECharts 的热力图不仅支持静态数据展示,还能实时更新数据或添加交互。例如,用户点击某个数据点时可以高亮显示或触发某些事件。

heatmapChart.on('click', function (params) {
    console.log(params.name + ': ' + params.value[2]);
});

通过监听 click 事件,我们可以实现热力图的交互功能,让图表更加动态。

四、结合其他组件使用

ECharts 的热力图还可以结合其他组件来增强功能。例如,可以添加图例、数据视图、缩放功能等。

1. 添加图例和数据视图

toolbox: {
    feature: {
        dataView: { show: true, readOnly: false },
        saveAsImage: { show: true }
    }
}

2. 添加数据缩放功能

如果热力图数据量较大,可以通过 dataZoom 组件实现数据缩放。

dataZoom: {
    type: 'slider',
    show: true
}

五、总结

本文详细介绍了如何使用 ECharts 构建热力图,包括基础配置、色阶与渐变、数据映射以及与其他组件的结合使用。通过 ECharts 强大的可视化功能,我们可以轻松绘制出美观且实用的热力图,用以展示数据的密度、趋势和分布。

在实际应用中,热力图广泛用于地理信息系统、时间序列分析、数据可视化等领域。希望本文的示例和讲解能帮助你更好地掌握 ECharts 热力图的使用。