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>
  • 相关阅读:
    KVCKVO
    音频
    静态库
    百度地图API
    CALayer
    触摸事件
    iOS中打电话、打开网址、发邮件、发短信等
    NSURLSession网络接口
    Quartz2D常见图形的绘制:线条、多边形、圆
    通知中心(NSNotificationCenter)
  • 原文地址:https://www.cnblogs.com/jinjidedale/p/7202284.html
Copyright © 2011-2022 走看看