基于 ECharts 与 Flask 的交互式数据可视化应用开发
本文介绍如何结合 Flask 后端与 ECharts 前端构建交互式数据可视化应用。通过 Flask 搭建 RESTful 接口处理 CSV 或数据库数据,利用 ECharts 渲染柱状图与折线图。文章涵盖环境配置、项目结构、前后端交互代码实现及常见问题解决方案,适合快速原型开发。

本文介绍如何结合 Flask 后端与 ECharts 前端构建交互式数据可视化应用。通过 Flask 搭建 RESTful 接口处理 CSV 或数据库数据,利用 ECharts 渲染柱状图与折线图。文章涵盖环境配置、项目结构、前后端交互代码实现及常见问题解决方案,适合快速原型开发。

数据可视化是将抽象数据转化为直观图形的过程,它不仅能让数据更易理解,还能帮助我们发现数据背后的规律和趋势。ECharts 作为百度开源的可视化库,以其丰富的图表类型、灵活的配置和良好的交互性成为前端可视化的首选工具;而 Flask 作为轻量级的 Python Web 框架,能快速搭建后端服务,实现数据的动态加载和交互。本文将从基础原理出发,一步步讲解如何结合 ECharts 和 Flask,开发一个完整的交互式数据可视化 Web 应用。
在开始开发前,先明确核心技术栈的定位:
安装 Flask 及数据处理依赖:
# 安装 Flask
pip install flask
# 可选:处理 CSV 数据
pip install pandas
# 可选:连接数据库(如 MySQL)
pip install pymysql
无需额外安装,直接通过 CDN 引入 ECharts 即可,也可下载本地文件引入。本文使用 CDN 方式:
<!-- 引入 ECharts 5.x 版本 -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
先规划清晰的项目结构,便于后续维护:
data-visualization-app/
├── app.py # Flask 主程序
├── static/ # 静态文件目录(JS/CSS/图片)
│ └── js/
│ └── chart.js # ECharts 初始化脚本
├── templates/ # 前端模板目录
│ └── index.html # 可视化页面
└── data/ # 数据文件目录
└── sales_data.csv # 示例数据(销售数据)
首先实现两个核心接口:
示例代码如下:
from flask import Flask, render_template, jsonify
import pandas as pd
import os
# 初始化 Flask 应用
app = Flask(__name__)
# 读取本地 CSV 数据(模拟业务数据)
def load_sales_data():
data_path = os.path.join(app.root_path, 'data', 'sales_data.csv')
# 示例 CSV 结构:month(月份), sales(销售额), profit(利润)
df = pd.read_csv(data_path)
# 转换为字典格式,便于 JSON 序列化
data = {
'months': df['month'].tolist(),
'sales': df['sales'].tolist(),
'profit': df['profit'].tolist()
}
return data
# 根路由:返回可视化页面
@app.route('/')
def index():
return render_template('index.html')
# 数据接口:返回销售数据
@app.route('/api/sales')
def get_sales_data():
try:
data = load_sales_data()
return jsonify({
'code': 200,
'msg': 'success',
'data': data
})
except Exception as e:
return jsonify({
'code': 500,
'msg': f'数据加载失败:{str(e)}',
'data': {}
})
# 启动应用
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
在 data 目录下创建 CSV 文件,内容如下:
month,sales,profit
1 月,12000,3500
2 月,15000,4200
3 月,9000,2800
4 月,18000,5000
5 月,22000,6500
6 月,17000,4800
在 templates 目录下创建 HTML 文件,实现页面结构、样式,并通过 AJAX 请求后端数据,初始化 ECharts 图表。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>销售数据可视化</title>
<!-- 引入 ECharts CDN -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
<!-- 引入 jQuery(简化 AJAX 请求) -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { padding: 20px; background-color: #f5f5f5; }
.chart-container { width: 100%; height: 600px; background-color: #fff; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 20px; margin-top: 20px; }
h1 { color: #333; text-align: center; margin-bottom: 10px; }
.status { text-align: center; color: #666; font-size: 14px; margin: 10px 0; }
</style>
</head>
<body>
<h1>2024 年上半年销售数据可视化</h1>
<div id="status">加载数据中...</div>
<div id="salesChart" class="chart-container"></div>
<script>
// 初始化 ECharts 实例
var chartDom = document.getElementById('salesChart');
var myChart = echarts.init(chartDom);
// 定义图表配置项(初始为空)
var option = {
title: {
text: '销售额&利润趋势',
left: 'center',
textStyle: { fontSize: 18, fontWeight: 'normal' }
},
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' }
},
legend: {
data: ['销售额', '利润'],
top: '10%'
},
grid: {
left: '3%', right: '4%', bottom: '3%', containLabel: true
},
xAxis: {
type: 'category',
data: [] // 后续从后端填充
},
yAxis: {
type: 'value',
name: '金额(元)'
},
: [
{
: ,
: ,
: [],
: { : }
},
{
: ,
: ,
: [],
: { : },
: { : }
}
]
};
$.({
: ,
: ,
: ,
: () {
(res. === ) {
option.. = res..;
option.[]. = res..;
option.[]. = res..;
myChart.(option);
.(). = ;
} {
.(). = res.;
}
},
: () {
.(). = ;
}
});
.(, () {
myChart.();
});
</script>
</body>
</html>
ECharts 支持丰富的交互功能,可在 option 中添加配置:
开启图表拖拽重计算:
series: [
{
// 其他配置
draggable: true,
onDragEnd: function(params) {
// 拖拽结束后可发送数据到后端保存
console.log('拖拽后数据:', params.data);
}
}
]
开启数据区域缩放:
dataZoom: [
{ type: 'inside', xAxisIndex: 0 },
{ type: 'slider', xAxisIndex: 0, bottom: 0 }
]
数据过滤接口:添加参数支持前端筛选数据(如按月份、年份):
@app.route('/api/sales')
def get_sales_data():
year = request.args.get('year', '2024') # 根据 year 过滤数据
df = pd.read_csv(data_path)
df = df[df['year'] == year] # 假设 CSV 新增 year 列
# 后续逻辑不变
连接数据库:将 CSV 数据替换为数据库查询,例如 MySQL:
import pymysql
def load_sales_data_from_db():
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
db='sales_db',
charset='utf8'
)
cursor = conn.cursor()
cursor.execute('SELECT month, sales, profit FROM sales_table WHERE year=2024')
data = cursor.fetchall()
conn.close()
# 转换数据格式
months = [row[0] for row in data]
sales = [row[1] for row in data]
profit = [row[2] for row in data]
return {'months': months, 'sales': sales, 'profit': profit}
可结合 Bootstrap、Element UI 等 UI 框架美化页面,例如添加筛选按钮、数据导出功能等。
http://localhost:5000,即可看到销售数据可视化图表 —— 柱状图展示销售额,折线图展示利润,支持 tooltip 悬浮提示、窗口自适应等功能。启动 Flask 应用:
python app.py
None 值、非数字类型等导致 ECharts 渲染失败。height: 600px),否则无法渲染。pip install flask-cors
from flask_cors import CORS
CORS(app) # 允许所有跨域请求
本文通过 Flask 搭建后端数据接口,结合 ECharts 实现前端数据可视化,完成了一个从数据读取、处理到可视化展示的完整流程。ECharts 的灵活性和 Flask 的轻量性让这套方案既适合快速原型开发,也可扩展为企业级应用。在此基础上,还可进一步集成数据权限控制、多图表联动、数据导出等功能,满足更复杂的业务需求。
数据可视化的核心是'让数据说话',而技术只是手段——合理选择图表类型、优化交互体验,才能让可视化应用真正发挥价值。希望本文能为开发者提供从技术落地到场景应用的完整思路,助力打造更优质的数据分析产品。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online