利用 Flask 动态展示 Pyecharts 图表数据的几种方法

本文详述了如何在Flask框架下利用PyEcharts实现数据可视化,涵盖静态图表展示、动态数据更新、定时全量及增量更新图表等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=jpeg

本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀…

Flask 模板渲染

1. 新建一个项目flask_pyecharts

在编辑器中选择 New Project,然后选择 Flask,创建完之后,Pycharm 会帮我们把启动脚本和模板文件夹都建好

640?wx_fmt=png
640?wx_fmt=png
2. 拷贝 pyecharts 模板

将链接中的以下模板

3.渲染图表

主要目标是将 pyecharts 生成的图表数据在视图函数中返回,所以我们直接在 app.py 中修改代码,如下:

from flask import Flask
from jinja2 import Markup


from pyecharts import options as opts
from pyecharts.charts import Bar

app = Flask(__name__, static_folder="templates")


def bar_base() -> Bar:
    c = (
        Bar()
            .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
            .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
            .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
            .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    )
    return c


@app.route("/")
def index():
    c = bar_base()
    return Markup(c.render_embed())


if __name__ == "__main__":
    app.run()

直接运行,在浏览器中输入地址,直接将数据显示出来了

640?wx_fmt=png

这是一个很简单的静态数据展示,别急好戏还在后头~

Flask 前后端分离

前面讲的是一个静态数据的展示的方法,用 pyecharts 和  Flask 结合最主要是实现一种动态更新数据,增量更新数据等功能!以上面讲解的内容为基础,在 templates 文件夹中新建一个 index.html 的文件,其中主要用到了 jquery 和 pyecharts 管理的 echarts.min.js 依赖。

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>动态更新数据</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
    <div id="bar" ></div>
    <script>
      (
        function () {
            var result_json = '{{ result_json|tojson }}';
            // var result = JSON.parse(result_json);
            var chart = echarts.init(document.getElementById('bar'), 'gray', {renderer: 'canvas'});
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:5000/barChart",
                dataType: 'json',
                data: {result: result_json},
                success: function (result) {
                    chart.setOption(result);
                }
            });
        }
    )
    </script>
</body>
</html>

有 html 基础的朋友应该知道该代码主要是向地址 "127.0.0.1:5000/barChart" 发送请求,所以在 app.py 中我们也需要做相应的修改,添加该地址的路由函数,从而实现动态数据更新。

@app.route("/")
def index():
    data = request.args.to_dict()
    return render_template("index.html", result_json=data)

@app.route("/barChart")
def get_bar_chart():
    args = request.args.to_dict()
    result = eval(args.get("result"))
    name = result.get("name")
    subtitle = result.get("subtitle")
    c = bar_base(name, subtitle)

    return c.dump_options_with_quotes()

在 index 视图函数中接收浏览器传过来的参数,然后传递给 index.html。此处只是简单示例,所以未做参数校验。而另一个视图函数主要是获取参数,传给图表生成函数 bar_base(), 从而实现根据 url 地址传过来的参数,动态展示图表数据。结果如下:

640?wx_fmt=png

这里只是简单演示, 所以只将图表标题作为动态传参。此场景适用于第一次请求获取我们想要的数据,然后将其展示出来。比如我之前写的 NBA 球员数据可视化

就是此方法,不同球员展示对应球员数据!

定时全量更新图表

该场景主要是前端主动向后端进行数据刷新,定时刷新的核心在于 HTML 的 setInterval 方法。那么 index.html 代码就是下面这样的:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
    <div id="bar" ></div>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});

        $(
            function () {
                fetchData(chart);
                setInterval(fetchData, 2000);
            }
        );

        function fetchData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:5000/barChart",
                dataType: 'json',
                success: function (result) {
                    chart.setOption(result);
                }
            });
        }
    </script>
</body>
</html>

对应的将 app.py 中 bar_base() 作相应的修改,从而实现定时全量更新图表

def bar_base() -> Bar:
    c = (
        Bar()
            .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
            .add_yaxis("商家A", [random.randint(10, 100) for _ in range(6)])
            .add_yaxis("商家B", [random.randint(10, 100) for _ in range(6)])
            .set_global_opts(title_opts=opts.TitleOpts(title="", subtitle=""))
    )
    return c

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/barChart")
def get_bar_chart():
    c = bar_base()
    return c.dump_options_with_quotes()

运行之后,在浏览器中打开,效果如下:

640?wx_fmt=gif
定时更新图表

看到这动图,有没有一种…,如果我是 DJ DJ,琦你太美…

定时增量更新图表

同样的要对 index.html 做修改

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>

</head>
<body>
    <div id="bar" ></div>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
        var old_data = [];
        $(
            function () {
                fetchData(chart);
                setInterval(getDynamicData, 2000);
            }
        );

        function fetchData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:5000/lineChart",
                dataType: "json",
                success: function (result) {
                    chart.setOption(result);
                    old_data = chart.getOption().series[0].data;
                }
            });
        }

        function getDynamicData() {
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:5000/lineDynamicData",
                dataType: "json",
                success: function (result) {
                    old_data.push([result.name, result.value]);
                    chart.setOption({
                        series: [{data: old_data}]
                    });
                }
            });
        }

    </script>
</body>
</html>

增量更新,后端代码也需要相应的修改

from pyecharts.charts import Line

def line_base() -> Line:
    line = (
        Line()
        .add_xaxis(["{}".format(i) for i in range(10)])
        .add_yaxis(
            series_name="",
            y_axis=[randrange(50, 80) for _ in range(10)],
            is_smooth=True,
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="动态数据"),
            xaxis_opts=opts.AxisOpts(type_="value"),
            yaxis_opts=opts.AxisOpts(type_="value"),
        )
    )
    return line

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/lineChart")
def get_line_chart():
    c = line_base()
    return c.dump_options_with_quotes()

idx = 9

@app.route("/lineDynamicData")
def update_line_data():
    global idx
    idx = idx + 1
    return jsonify({"name": idx, "value": randrange(50, 80)})

走起,来看看效果吧

640?wx_fmt=gif


数据分析和爬虫:

### Flask 中集成 Pyecharts 实现动态图表展示Flask 应用程序中集成 Pyecharts 可以轻松实现动态数据可视化。以下是具体的方法和步骤: --- #### 1. 安装必要的库 首先需要安装 FlaskPyecharts,可以通过 pip 工具完成: ```bash pip install flask pyecharts jinja2 ``` 这两个库分别用于搭建 Web 框架和支持生成图表。 --- #### 2. 创建基本的 Flask 应用结构 建立一个标准的 Flask 项目目录布局,通常包括以下几个部分: - `app.py`: 主应用程序入口。 - `templates/`: 存放前端模板文件的地方。 - `static/`: 放置 CSS、JS 文件以及其他资源的位置。 --- #### 3.Flask 路由中渲染 Pyecharts 图表 Pyecharts 提供了一种便捷的方式来嵌入到 Jinja2 模板引擎中,这使得它非常适合与 Flask 结合使用。以下是一个完整的示例代码,演示如何在一个路由中返回带有图表的页面。 ##### 示例代码:`app.py` ```python from flask import Flask, render_template from pyecharts.charts import Bar from pyecharts import options as opts app = Flask(__name__) @app.route('/') def index(): bar_chart = create_bar_chart() return render_template('index.html', chart=bar_chart.dump_options()) def create_bar_chart(): c = ( Bar() .add_xaxis(['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']) .add_yaxis('销量', [randint(10, 100) for _ in range(6)]) .set_global_opts(title_opts=opts.TitleOpts(title='销售情况')) ) return c if __name__ == '__main__': app.run(debug=True) ``` 在这个例子中,我们定义了一个 `/` 路径来处理主页请求,并调用了函数 `create_bar_chart()` 来生成柱状图实例。最后通过 `.dump_options()` 方法图表配置导出为 JSON 字符串传送给前端[^1]。 --- #### 4. 前端模板编写 接下来,在 `templates/index.html` 文件里引入 ECharts 的 JavaScript 库并设置好容器区域以便显示图表内容。 ##### 示例代码:`templates/index.html` ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Flask + PyEcharts</title> <!-- 引入 echarts --> <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> </head> <body> <div id="chart" style="width: 600px; height: 400px;"></div> <script type="text/javascript"> var chartDom = document.getElementById('chart'); var myChart = echarts.init(chartDom); var option = {{ chart | safe }}; myChart.setOption(option); </script> </body> </html> ``` 这段 HTML 文档设置了画布尺寸并通过 JavaScript 初始化了 ECharts 对象,随后把从后端接收到的选项参数赋值给这个对象完成初始化过程[^2]。 --- #### 5. 动态更新图表数据 如果希望实现实时或者周期性地改变图表上的数值,则可以在客户端发起 AJAX 请求获取最新数据源再重新加载图表;也可以采用 WebSocket 技术保持双向通信连接从而推送消息通知更改状态[^3]。 例如修改上面提到的服务端逻辑让它每次访问都随机产生新的 Y 轴坐标集合即可达到目的。 --- ### 总结 以上就是关于怎样借助 FlaskPyecharts 打造具备交互特性的在线仪表盘解决方案的整体思路介绍。整个流程涵盖了环境准备、服务端编程以及客户界面设计等多个方面知识点的学习应用实践操作指南说明文档教程[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值