zoukankan      html  css  js  c++  java
  • python数据可视化之flask+echarts(二)

     一位朋友说上一篇博客上返回的数据不好取,直接返回json格式的数据会更好,于是就有了下面这篇,原理和上一篇相同

    test_db.py创建虚拟数据的文件

    # coding=utf-8
    import sqlite3

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')

    # 连接数据库
    conn = sqlite3.connect('test.db')
    conn.text_factory = str
    c = conn.cursor()

    # 创建表地图表
    c.execute('CREATE TABLE geoCoordMap (name text, map decimal(12,8), conver int)')


    convervalue = [("海门",'121.15,31.89', 9 ),
    ("招远",'120.38,37.35', 10 ),
    ("舟山",'122.207216,29',10 ),
    ("盐城",'120.13,33.38', 10 ),
    ("赤峰",'118.87,42.28', 10 ),
    ("青岛",'120.33,36.07', 10 ),
    ("乳山",'121.52,36.89', 10 ),
    ("金昌",'102.188043,38',10 ),
    ("泉州",'118.58,24.93', 10 ),
    ("莱西",'120.53,36.86',109 ),
    ("日照",'119.46,35.42',109 ),
    ("胶南",'119.97,35.88', 39 ),
    ("南通",'121.05,32.08', 39 ),
    ("拉萨",'91.11,29.97', 39 ),
    ("云浮",'112.02,22.93', 39 ),
    ("梅州",'116.1,24.55', 39 ),
    ("文登",'122.05,37.2', 39 ),
    ("上海",'121.48,31.22', 12),
    ("威海",'122.1,37.5', 12),
    ("承德",'117.93,40.97', 12),
    ("厦门",'118.1,24.46', 12),
    ("汕尾",'115.375279,22',12),
    ("潮州",'116.63,23.68', 12),
    ("丹东",'124.37,40.13', 12),
    ("太仓",'121.1,31.45', 12),
    ("曲靖",'103.79,25.51', 12),
    ("烟台",'121.39,37.52', 12),
    ("福州",'119.3,26.08', 12),
    ("即墨",'120.45,36.38', 12),
    ("抚顺",'123.97,41.97', 12),
    ("玉溪",'102.52,24.35', 12),
    ("阳泉",'113.57,37.85', 12),
    ("莱州",'119.942327,37',12),
    ("湖州",'120.1,30.86', 12),
    ("汕头",'116.69,23.39', 12),
    ("昆山",'120.95,31.39', 12),
    ("宁波",'121.56,29.86', 12),
    ("湛江",'110.359377,21',12),
    ("揭阳",'116.35,23.55', 12),
    ("荣成",'122.41,37.16', 12),
    ("常熟",'120.74,31.64', 12),
    ("东莞",'113.75,23.04', 12),
    ("河源",'114.68,23.73', 12),
    ("淮安",'119.15,33.5', 12),
    ("泰州",'119.9,32.49', 12),
    ("南宁",'108.33,22.84', 12),
    ("营口",'122.18,40.65', 12),
    ("惠州",'114.4,23.09', 12),
    ("江阴",'120.26,31.91', 12),
    ("蓬莱",'120.75,37.8', 12),
    ("韶关",'113.62,24.84', 12),
    ("广州",'113.23,23.16', 12),
    ("延安",'109.47,36.6', 12),
    ("太原",'112.53,37.87', 12),
    ("清远",'113.01,23.7', 12),
    ("中山",'113.38,22.52', 12),
    ("昆明",'102.73,25.04', 12),
    ("寿光",'118.73,36.86', 12),
    ("盘锦",'122.070714,41',12),
    ("长治",'113.08,36.18', 12),
    ("深圳",'114.07,22.62', 12),
    ("珠海",'113.52,22.3', 12),
    ("宿迁",'118.3,33.96', 12),
    ("咸阳",'108.72,34.36', 12),
    ("铜川",'109.11,35.09', 12),
    ("平度",'119.97,36.77', 12),
    ("佛山",'113.11,23.05', 12),
    ("海口",'110.35,20.02', 12),
    ("江门",'113.06,22.61', 12),
    ("章丘",'117.53,36.72', 12),
    ("肇庆",'112.44,23.05', 12),
    ("大连",'121.62,38.92', 12),
    ("临汾",'111.5,36.08', 12),
    ("吴江",'120.63,31.16', 12),
    ("沈阳",'123.38,41.8', 12),
    ("苏州",'120.62,31.32', 12),
    ("茂名",'110.88,21.68', 12),
    ("嘉兴",'120.76,30.77', 12),
    ("长春",'125.35,43.88', 12),
    ("胶州",'120.03336,36', 12),
    ("银川",'106.27,38.47', 12),
    ("锦州",'121.15,41.13', 12),
    ("南昌",'115.89,28.68', 12),
    ("柳州",'109.4,24.33', 12),
    ("三亚",'109.511909,18',12),
    ("自贡",'104.778442,29',12),
    ("吉林",'126.57,43.87', 12),
    ("阳江",'111.95,21.85', 12),
    ("泸州",'105.39,28.91', 12),
    ("西宁",'101.74,36.56', 12),
    ("宜宾",'104.56,29.77', 12),
    ("成都",'104.06,30.67', 12),
    ("大同",'113.3,40.12', 12),
    ("镇江",'119.44,32.2', 12),
    ("桂林",'110.28,25.29', 12),
    ("宜兴",'119.82,31.36', 12),
    ("北海",'109.12,21.49', 12),
    ("西安",'108.95,34.27', 12),
    ("金坛",'119.56,31.74', 12),
    ("东营",'118.49,37.46', 12),
    ("遵义",'106.9,27.7', 12),
    ("绍兴",'120.58,30.01', 12),
    ("扬州",'119.42,32.39', 12),
    ("常州",'119.95,31.79', 12),
    ("潍坊",'119.1,36.62', 12),
    ("重庆",'106.54,29.59', 12),
    ("台州",'121.420757,28',12),
    ("南京",'118.78,32.04', 12),
    ("滨州",'118.03,37.36', 12),
    ("贵阳",'106.71,26.57', 12),
    ("无锡",'120.29,31.59', 12),
    ("本溪",'123.73,41.3', 12),
    ("渭南",'109.5,34.52', 12),
    ("宝鸡",'107.15,34.38', 12),
    ("焦作",'113.21,35.24', 12),
    ("句容",'119.16,31.95', 12),
    ("北京",'116.46,39.92', 12),
    ("徐州",'117.2,34.26', 12),
    ("衡水",'115.72,37.72', 12),
    ("包头",'110,40.58', 12),
    ("绵阳",'104.73,31.48', 12),
    ("枣庄",'117.57,34.86', 12),
    ("杭州",'120.19,30.26', 12),
    ("淄博",'118.05,36.78', 12),
    ("鞍山",'122.85,41.12', 12),
    ("溧阳",'119.48,31.43', 12),
    ("安阳",'114.35,36.1', 12),
    ("开封",'114.35,34.79', 12),
    ("济南",'117,36.65', 12),
    ("德阳",'104.37,31.13', 12),
    ("温州",'120.65,28.01', 12),
    ("九江",'115.97,29.71', 12),
    ("邯郸",'114.47,36.6', 12),
    ("临安",'119.72,30.23', 12),
    ("兰州",'103.73,36.03', 12),
    ("沧州",'116.83,38.33', 12),
    ("临沂",'118.35,35.05', 12),
    ("南充",'106.110698,30',12),
    ("天津",'117.2,39.13', 12),
    ("富阳",'119.95,30.07', 12),
    ("泰安",'117.13,36.18', 12),
    ("诸暨",'120.23,29.71', 12),
    ("郑州",'113.65,34.76', 12),
    ("聊城",'115.97,36.45', 12),
    ("芜湖",'118.38,31.33', 12),
    ("唐山",'118.02,39.63', 12),
    ("邢台",'114.48,37.05', 12),
    ("德州",'116.29,37.45', 12),
    ("济宁",'116.59,35.38', 12),
    ("荆州",'112.239741,30',12),
    ("宜昌",'111.3,30.7', 12),
    ("义乌",'120.06,29.32', 12),
    ("丽水",'119.92,28.45', 12),
    ("洛阳",'112.44,34.7', 12),
    ("株洲",'113.16,27.83', 12),
    ("莱芜",'117.67,36.19', 12),
    ("常德",'111.69,29.05', 12),
    ("保定",'115.48,38.85', 12),
    ("湘潭",'112.91,27.87', 12),
    ("金华",'119.64,29.12', 12),
    ("岳阳",'113.09,29.37', 12),
    ("长沙",'113,28.21', 12),
    ("衢州",'118.88,28.97', 12),
    ("廊坊",'116.7,39.53', 2),
    ("菏泽",'115.480656,35',21),
    ("合肥",'117.27,31.86',21 ),
    ("武汉",'114.31,30.52',21 ),
    ("大庆",'125.03,46.58',21 )]

    # 插入数据
    c.executemany('INSERT INTO geoCoordMap VALUES (?,?,?)', convervalue)

    # 提交执行
    conn.commit()

    # 关闭数据库连接
    conn.close()

    运行程序app.py

    # coding=utf-8
    import sqlite3
    from flask import Flask,render_template,json,jsonify,request
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')

    app = Flask(__name__)


    def get_db():
    db = sqlite3.connect('test.db')
    return db


    def query_db(query, args=(), one=False):
    db = get_db()
    cur = db.execute(query, args)
    db.commit()
    rv = cur.fetchall()
    db.close()
    return (rv[0] if rv else None) if one else rv


    @app.route("/", methods=["GET"])
    def index():
    return render_template("index.html")


    @app.route("/map", methods=["GET"])
    def air_map():
    if request.method == "GET":
    res = query_db("select * from geoCoordMap")

    citys = []
    # 这里需要先设置一个空数组,将sql返回的数据进行逐个存到这个数组里面,在将结果转化为json格式
    for r in res:
    city_map = {}
    city_map['name'] = r[0]
    city_map['map'] = r[1]
    city_map['value'] = r[2]
    citys.append(city_map)

    return jsonify(citys)

    这里启动服务,访问127.0.0.1:5000/map,返回的数据是数组中的json串

    这样更加方便前端获取有效数据

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>ECharts3 Ajax</title>
    <script src="{{ url_for('static', filename='jquery-3.2.1.js') }}"></script>
    <script src="{{ url_for('static', filename='echarts.js') }}"></script>
    <script src="{{ url_for('static', filename='china.js') }}"></script>
    </head>
    <body>
    <div id="main" style=" 1000px;height:600px;"></div>
    <script type="text/javascript">
    var myChart = echarts.init(document.getElementById('main'));
    var mapData = [];
    var geoCoordMap={};
    $.get('/map').done(function (data){
    // console.log(data);
    if(data){
    data.forEach(function (obj) {
    var dataObj = {};
    dataObj.name = obj.name;
    dataObj.value = obj.value;
    geoCoordMap[obj.name] = obj.map.split(',');
    mapData.push(dataObj)
    });
    }
    // console.log(mapData);
    // console.log(geoCoordMap);


    var convertData = function (data) {
    var res = [];
    for (var i = 0; i < data.length; i++) {
    var geoCoord = geoCoordMap[data[i].name];
    if (geoCoord) {
    res.push({
    name: data[i].name,
    value: geoCoord.concat(data[i].value)
    });
    }
    }
    return res;
    };
    option = {
    backgroundColor: '#404a59',
    title: {
    text: '全国主要城市空气质量',
    subtext: 'data from PM25.in',
    sublink: 'http://www.pm25.in',
    left: 'center',
    textStyle: {
    color: '#fff'
    }
    },
    tooltip : {
    trigger: 'item'
    },
    legend: {
    orient: 'vertical',
    y: 'bottom',
    x:'right',
    data:['pm2.5'],
    textStyle: {
    color: '#fff'
    }
    },
    geo: {
    map: 'china',
    label: {
    emphasis: {
    show: false
    }
    },
    roam: true,
    itemStyle: {
    normal: {
    areaColor: '#323c48',
    borderColor: '#111'
    },
    emphasis: {
    areaColor: '#2a333d'
    }
    }
    },
    series : [
    {
    name: 'pm2.5',
    type: 'scatter',
    coordinateSystem: 'geo',
    data: convertData(mapData),
    symbolSize: function (val) {
    return val[2] / 10;
    },
    label: {
    normal: {
    formatter: '{b}',
    position: 'right',
    show: false
    },
    emphasis: {
    show: true
    }
    },
    itemStyle: {
    normal: {
    color: '#ddb926'
    }
    }
    },
    {
    name: 'Top 5',
    type: 'effectScatter',
    coordinateSystem: 'geo',
    data: convertData(mapData.sort(function (a, b) {
    return b.value - a.value;
    }).slice(0, 6)),
    symbolSize: function (val) {
    return val[2] / 10;
    },
    showEffectOn: 'render',
    rippleEffect: {
    brushType: 'stroke'
    },
    hoverAnimation: true,
    label: {
    normal: {
    formatter: '{b}',
    position: 'right',
    show: true
    }
    },
    itemStyle: {
    normal: {
    color: '#f4e925',
    shadowBlur: 10,
    shadowColor: '#333'
    }
    },
    zlevel: 1
    }
    ]
    };
    myChart.setOption(option);
    });


    </script>
    </body>
    </html>
  • 相关阅读:
    将截断字符串或二进制数据。语句已终止的解决方法
    201812-1 小明上学 Java
    201809-2 买菜 Java
    201809-1 卖菜 Java
    201803-2 碰撞的小球 Java
    201803-1 跳一跳 Java
    201712-2 游戏 Java
    201712-1 最小差值 Java
    201709-2 公共钥匙盒 Java
    201709-1 打酱油 Java
  • 原文地址:https://www.cnblogs.com/jinjidedale/p/7202284.html
Copyright © 2011-2022 走看看