桑基图 (Sankey Diagram)

 前端   小卒子   2024-10-11 23:02   369

ECharts 桑基图:绘制数据流动关系图

桑基图(Sankey Diagram)是一种用于展示流动关系的图表,特别适合于表现能量、资金或物质等的流向与数量关系。桑基图通过节点和连接线的粗细来直观地表达数据的流动情况,非常适合于分析复杂系统中的资源流动。本文将详细介绍如何使用 ECharts 绘制桑基图,并讲解其配置方法和样式设置。

一、桑基图的基础知识

桑基图的特点在于流动的方向和大小可以通过线条的宽度表示,线的粗细代表流动量的大小,而节点则表示流动的源头和去向。桑基图不仅能直观地展示流向关系,还能帮助识别流动的主要来源和去向。

二、安装 ECharts

在使用 ECharts 桑基图之前,首先确保在项目中引入 ECharts。可以通过 CDN 进行引入:

<script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>

三、绘制基本的桑基图

1. 定义 HTML 结构

首先,定义一个用于展示桑基图的 <div> 容器:

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

2. 配置桑基图的 option

以下是一个绘制基本桑基图的配置示例:

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

var sankeyOption = {
    title: {
        text: '桑基图示例',
        left: 'center',
        textStyle: {
            color: '#333',
            fontSize: 20
        }
    },
    tooltip: {
        trigger: 'item',
        formatter: '{b}: {c}'
    },
    series: {
        type: 'sankey',
        layout: 'orient',
        data: [
            { name: '输入' },
            { name: '输出1' },
            { name: '输出2' },
            { name: '输出3' }
        ],
        links: [
            { source: '输入', target: '输出1', value: 8 },
            { source: '输入', target: '输出2', value: 6 },
            { source: '输入', target: '输出3', value: 4 }
        ],
        itemStyle: {
            normal: {
                borderColor: '#fff',
                borderWidth: 1,
                opacity: 0.8
            }
        },
        lineStyle: {
            normal: {
                color: '#aaa',
                opacity: 0.5,
                curveness: 0.5
            }
        }
    }
};

sankeyChart.setOption(sankeyOption);

3. 完整的 HTML 代码示例

以下是完整的 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="sankeyChart" style="width: 800px; height: 600px;"></div>

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

        var sankeyOption = {
            title: {
                text: '桑基图示例',
                left: 'center',
                textStyle: {
                    color: '#333',
                    fontSize: 20
                }
            },
            tooltip: {
                trigger: 'item',
                formatter: '{b}: {c}'
            },
            series: {
                type: 'sankey',
                layout: 'orient',
                data: [
                    { name: '输入' },
                    { name: '输出1' },
                    { name: '输出2' },
                    { name: '输出3' }
                ],
                links: [
                    { source: '输入', target: '输出1', value: 8 },
                    { source: '输入', target: '输出2', value: 6 },
                    { source: '输入', target: '输出3', value: 4 }
                ],
                itemStyle: {
                    normal: {
                        borderColor: '#fff',
                        borderWidth: 1,
                        opacity: 0.8
                    }
                },
                lineStyle: {
                    normal: {
                        color: '#aaa',
                        opacity: 0.5,
                        curveness: 0.5
                    }
                }
            }
        };

        sankeyChart.setOption(sankeyOption);
    </script>
</body>
</html>

四、桑基图的配置详解

1. 节点和链接的配置

  • data:节点数据,用于定义桑基图中的所有节点。每个节点可以有一个 name 属性。
  • links:链接数据,用于定义节点之间的流动关系。每个链接包含以下属性:
    • source:流动的起始节点。
    • target:流动的目标节点。
    • value:流动的数量。

2. 节点样式配置

通过 itemStyle 属性可以自定义节点的样式:

itemStyle: {
    normal: {
        borderColor: '#fff',
        borderWidth: 1,
        opacity: 0.8
    }
}

3. 链接样式配置

通过 lineStyle 属性可以自定义链接的样式:

lineStyle: {
    normal: {
        color: '#aaa',
        opacity: 0.5,
        curveness: 0.5
    }
}
  • color:链接的颜色。
  • opacity:链接的透明度。
  • curveness:链接的曲线度,值越大曲线越明显。

五、增加交互性和动态效果

1. 添加工具提示

工具提示可以通过 tooltip 属性配置,使用户在鼠标悬停时看到详细信息:

tooltip: {
    trigger: 'item',
    formatter: function (params) {
        return `${params.data.source} → ${params.data.target}<br />流动量: ${params.data.value}`;
    }
}

2. 动态更新数据

如果需要动态更新桑基图的数据,可以通过 setOption 方法重新设置新的数据。例如,增加一个新的输出节点:

sankeyChart.setOption({
    series: {
        data: [
            { name: '输入' },
            { name: '输出1' },
            { name: '输出2' },
            { name: '输出3' },
            { name: '输出4' } // 新增节点
        ],
        links: [
            { source: '输入', target: '输出1', value: 8 },
            { source: '输入', target: '输出2', value: 6 },
            { source: '输入', target: '输出3', value: 4 },
            { source: '输入', target: '输出4', value: 5 } // 新增链接
        ]
    }
});

六、总结

本文详细介绍了如何使用 ECharts 绘制桑基图,包括基本桑基图的创建、节点和链接的配置、样式设置及交互效果的增强。桑基图是一种直观、易于理解的数据可视化工具,适合于展示各种流动关系。希望这篇博客能够帮助您掌握 ECharts 中桑基图的使用!