美文网首页
Python Web框架--框架Flask--PyCharts(

Python Web框架--框架Flask--PyCharts(

作者: 无剑_君 | 来源:发表于2019-12-12 10:12 被阅读0次

    一、安装pyecharts

      Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

    特性:
    简洁的 API 设计,使用如丝滑般流畅,支持链式调用
    囊括了 30+ 种常见图表,应有尽有
    支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
    可轻松集成至 Flask,Sanic,Django 等主流 Web 框架
    高度灵活的配置项,可轻松搭配出精美的图表
    详细的文档和示例,帮助开发者更快的上手项目
    多达 400+ 地图文件,并且支持原生百度地图,为地理数据可视化提供强有力的支持

    V1:仅支持 Python3.6+

    文档示例:http://pyecharts.herokuapp.com/
    官网:https://github.com/pyecharts/pyecharts

    二、安装PyEcharts

    pip install pyecharts -U
    
    

    安装组件:


    Scatter3D

    二、显示PyCharts

    1. Web直接显示
    from flask import Flask
    from pyecharts.charts import Bar
    from pyecharts import options as opts
    from flask import Markup
    
    app = Flask(__name__)
    app.config["DEBUG"] = True
    
    # 定义条图
    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()  # 设置debug=True是为了让代码修改实时生效,而不用每次重启加载
    
    Web直接显示
    1. Flask 前后端分离
      在 templates 文件夹中新建一个 index.html 的文件,其中主要用到了 jquery 和 pyecharts 管理的 echarts.min.js 依赖。
      1)前端页面
    <!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" style="width:1000px; height:600px;"></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请求
                $.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>
    

    2)后端代码

    from flask import Flask
    from flask import render_template
    # http请求库
    from flask  import request
    
    # pyecharts 库
    from pyecharts import options as opts
    from pyecharts.charts import Bar
    
    app = Flask(__name__)
    app.config["DEBUG"] = True
    
    # 根路径,渲染模板index.html
    @app.route("/")
    def index():
        data = request.args.to_dict()
        print(data)
        return render_template("index.html", result_json=data)
    
    # 定义标题参数绘制条图的函数
    def bar_base(name,subtitle) -> 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=name, subtitle=subtitle))
        )
        return c
    
    @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()
    
    if __name__ == '__main__':
        app.run()  # 设置debug=True是为了让代码修改实时生效,而不用每次重启加载
    
    
    1. 浏览测试
      请求地址:http://127.0.0.1:5000/?name=test&subtitle=test
      必须添加请求参数。
      浏览测试
    1. 动态数据显示
      1)前端页面
    <!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" style="width:1000px; height:600px;"></div>
    <script>
        var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
        // 每2秒更新一次
        $(
            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>
    

    2)后端代码

    from flask import Flask
    from flask import render_template
    # 随机函数
    import random
    
    # pyecharts 库
    from pyecharts import options as opts
    from pyecharts.charts import Bar
    
    app = Flask(__name__)
    app.config["DEBUG"] = True
    
    # 根路径,渲染模板index.html
    @app.route("/")
    def index():
        return render_template("index.html")
    
    # 随机数据条图
    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("/barChart")
    def get_bar_chart():
        c = bar_base()
        return c.dump_options_with_quotes()
    
    if __name__ == '__main__':
        app.run()  # 设置debug=True是为了让代码修改实时生效,而不用每次重启加载
    
    

    3)浏览显示


    浏览显示
    1. 使用变量获取数据
      1)html文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>图表示例</title>
        <style>
            .charts {
                /*background-color: red;*/
                height: 500px;
                width: 600px;
            }
        </style>
        <script src="../static/js/echarts.min.js"></script>
    </head>
    <body>
    <div id="charts" class="charts"></div>
    <div id="data" style="display: none">{{list}}</div>
    <script>
        var list = document.getElementById("data");
        var d = document.getElementById("charts");
    
        //  初始化图表
        var chart = echarts.init(d);
        option = {
            title: {
                text: '第一个小例子'
            },
            tooltip: {},
            legend: {
                data: ['销量']
            },
            xAxis: {
                // 读取后台数据转为json
                data: JSON.parse(list.innerText)
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data:  [35, 20, 56, 100, 80, 64]
            }]
        };
        chart.setOption(option);
    </script>
    </body>
    </html>
    
    1. python数据
    from  flask import Flask, url_for, request, jsonify, render_template
    
    # json 解析
    import json
    
    app = Flask(__name__)
    
    @app.route("/charts")
    def getCharts():
        data = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
        # 必须使用json.dumps进行转换 json.dumps是将一个Python数据类型列表进行json格式的编码解析
        # 否则双引号会转为单引号,导致前台无法解析此内容
        return render_template("charts.html", list=json.dumps(data))
    
    
    if __name__ == "__main__":
        # 启动flask
        app.run(port=9999, debug=True)
    
    
    1. 浏览访问


      浏览访问

    相关文章

      网友评论

          本文标题:Python Web框架--框架Flask--PyCharts(

          本文链接:https://www.haomeiwen.com/subject/ienkwctx.html