数据分析与可视化

flask+echarts数据可视化

2019-04-10  本文已影响0人  乔治大叔

最近忙着写数据可视化的东西,简书也很久没有写了,我是基于flask+echarts做的数据可视化。

app.py中

from flask import Flask, render_template, Response
import json

app = Flask(__name__)
app.debug = True


@app.route('/')
def hello_world():
    return 'Hello World!'


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

def Response_headers(content):
    resp = Response(content)
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

@app.route('/echarts',methods=['GET','POST'])
def echarts():
    import pymysql
    lst = []
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123',database='renkou',charset='utf8')
    cur = conn.cursor()
    cur.execute("""
    select * from china_population;
    """)
    for row in cur.fetchall():
        dic = {}
        dic['name'] = row[1]
        dic['num'] = row[2]
        lst.append(dic)

    datas = {
        "data": lst
    }
    content = json.dumps(datas)
    resp = Response_headers(content)
    return resp

@app.errorhandler(403)
def page_not_found(error):
    content = json.dumps({"error_code": "403"})
    resp = Response_headers(content)
    return resp


@app.errorhandler(404)
def page_not_found(error):
    content = json.dumps({"error_code": "404"})
    resp = Response_headers(content)
    return resp


@app.errorhandler(400)
def page_not_found(error):
    content = json.dumps({"error_code": "400"})
    resp = Response_headers(content)
    return resp


@app.errorhandler(410)
def page_not_found(error):
    content = json.dumps({"error_code": "410"})
    resp = Response_headers(content)
    return resp


@app.errorhandler(500)
def page_not_found(error):
    content = json.dumps({"error_code": "500"})
    resp = Response_headers(content)
    return resp

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
    <meta charset="utf-8">
    <!-- 引入 ECharts 文件 -->
    <script src="/static/echarts.min.js"></script>
    <script src="/static/jquery.js"></script>
</head>
<body>
    <div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
        var a = echarts;
        var myChart = a.init(document.getElementById('main'));
         // 显示标题,图例和空的坐标轴
         myChart.setOption({
             title: {
                 text: '城市人口数'
             },
             tooltip : {
            trigger: 'axis'
            },
            legend: {
                data:['今日数据']
            },
            toolbox: {
                show : true,
                feature : {
                    mark : {show: true},
                    dataView : {show: true, readOnly: false},
                    magicType : {show: true, type: ['line', 'bar']},
                    // restore : {show: true},
                    // saveAsImage : {show: true}
                }
            },
            calculable : true,

             xAxis : [
                {
                    type : 'category',
                    boundaryGap : false,
                    data : []
                }
            ],
             yAxis : [
                {
                    type : 'value',
                    axisLabel : {
                        formatter: '{value}'
                    }
                }
            ],
             dataZoom: [
            {
                show: true,
                start: 94,
                end: 100
            },
            {
                type: 'inside',
                start: 94,
                end: 100
            },
            {
                show: true,
                yAxisIndex: 0,
                filterMode: 'empty',
                width: 30,
                height: '80%',
                showDataShadow: false,
                left: '93%'
            }
        ],
             series : [
                {
                    name:'最多数量',
                    type:'line',
                    data:[],
                    markPoint : {
                        data : [
                            {type : 'max', name: '最大值'},
                            {type : 'min', name: '最小值'}
                        ]
                    },
                    markLine : {
                        data : [
                            {type : 'average', name: '平均值'}
                        ]
                    }
                },]
         });
         myChart.showLoading();    //数据加载完之前先显示一段简单的loading动画
         var names=[];    //名称数组(实际用来盛放X轴坐标值)
         var nums=[];    //数量数组(实际用来盛放Y坐标值)
         $.ajax({
         type : "get",
         url : "http://127.0.0.1:5000/echarts",    //请求发送到Servlet处
//       data : {},
         dataType : "json",        //返回数据形式为json
         success : function(result) {
             //请求成功时执行该函数内容,result即为服务器返回的json对象
             if (result) {
//              alert(result["data"]);
                    for(var i=0;i<result["data"].length;i++){
//                        alert(result["data"][i]["name"]);
                       names.push(result["data"][i]["name"]);    //挨个取出名称并填入类别数组
                     }
                    for(var i=0;i<result["data"].length;i++){
//                      alert(result["data"][i]["num"]);
                        nums.push(result["data"][i]["num"]);    //挨个取出数量并填入销量数组
                      }
                    myChart.hideLoading();    //隐藏加载动画
                    myChart.setOption({        //加载数据图表
                        xAxis: {
                            data: names
                        },
                        series: [{
                            // 根据名字对应到相应的系列
                            name: '数量',
                            data: nums
                        }]
                    });

             }

        },
         error : function(errorMsg) {
             //请求失败时执行该函数
         alert("图表请求数据失败!");
         myChart.hideLoading();
         }
    })
    </script>


</body>
</html>

数据库数据


CB2578E3-20AF-49FA-BAEE-545BBD525392.png

展示出来的图像


A918F081-E83B-46EB-AA9B-F03E5E748D29.png
上一篇 下一篇

猜你喜欢

热点阅读