python flask 数据可视化_python数据可视化之flask+echarts(二)

本篇博客主要介绍如何使用Python Flask与Echarts结合,通过Flask返回JSON格式数据,实现地图上的数据可视化。通过创建虚拟数据,存储在SQLite数据库中,并使用Flask路由获取并返回数据,最后Echarts前端接收数据并展示。这种方法让前端获取数据更加方便。
摘要由CSDN通过智能技术生成

一位朋友说上一篇博客上返回的数据不好取,直接返回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

ECharts3 Ajax

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);

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值