flask+sqlite3+echarts2+ajax数据可视化--静态图

结构:
/www
|
|-- /static
| |
| |-- echarts.js(当然还有echarts原dist目录下的文件(夹))
|
|-- /templates
| |
| |-- index.html
|
|-- app.py
|
|-- create_db.py

一、先准备数据

# create_db.py
# 只运行一次!!!

import sqlite3

# 连接
conn = sqlite3.connect('mydb.db')
c = conn.cursor()

# 创建表
c.execute('''DROP TABLE IF EXISTS weather''')
c.execute('''CREATE TABLE weather (month text, evaporation text, precipitation text)''')

# 数据
# 格式:月份,蒸发量,降水量
purchases = [('1月', 2, 2.6),
             ('2月', 4.9, 5.9),
             ('3月', 7, 9),
             ('4月', 23.2, 26.4),
             ('5月', 25.6, 28.7),
             ('6月', 76.7, 70.7),
             ('7月', 135.6, 175.6),
             ('8月', 162.2, 182.2),
             ('9月', 32.6, 48.7),
             ('10月', 20, 18.8),
             ('11月', 6.4, 6),
             ('12月', 3.3, 2.3)
            ]

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

# 提交!!!
conn.commit()

# 查询方式一
for row in c.execute('SELECT * FROM weather'):
    print(row)

# 查询方式二
c.execute('SELECT * FROM weather')
print(c.fetchall())

# 查询方式二_2
res = c.execute('SELECT * FROM weather')
print(res.fetchall())

# 关闭
conn.close()

二、定义路由

定义了两个路由:'/'和'/weather',后一个用于处理ajax,返回json格式。形如:

{month:['1月','2月',...],evaporation:[3.1, 4, 4.6, ...],precipitation:[...]}

# app.py

import sqlite3
from flask import Flask, request, render_template, jsonify

app = Flask(__name__)

def get_db():
    db = sqlite3.connect('mydb.db')
    db.row_factory = sqlite3.Row
    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("/weather", methods=["POST"])
def weather():
    if request.method == "POST":
        res = query_db("SELECT * FROM weather")

    return jsonify(month = [x[0] for x in res],
                   evaporation = [x[1] for x in res],
                   precipitation = [x[2] for x in res])

if __name__ == "__main__":
  app.run(debug=True)

三、使用echarts

这里使用单文件导入模式,见官网例子

值得注意的是导入echarts.js时使用了url_for函数。初时,我使用了src="js/echarts.js",老是导入不了!原因不详!

index.html文件如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>ECharts Ajax</title>
    <script type="text/javascript" src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
</head>

<body>
    <!--Step:1 为ECharts准备一个具备大小(宽高)的Dom-->
    <div id="main" style="height:500px;border:1px solid #ccc;padding:10px;"></div>

    <!--Step:2 引入echarts.js-->
    <!--<script src="js/echarts.js"></script>-->
    <script src="{{ url_for('static', filename='echarts.js') }}"></script>

    <script type="text/javascript">
    // Step:3 为模块加载器配置echarts的路径,从当前页面链接到echarts.js,定义所需图表路径
    require.config({
        paths: {
            echarts: './static',
        }
    });

    // Step:4 动态加载echarts然后在回调函数中开始使用,注意保持按需加载结构定义图表路径
    require(
        [
            'echarts',
            'echarts/chart/bar', // 按需加载
            'echarts/chart/line',
        ],
        function (ec) {
            //--- 折柱 ---
            var myChart = ec.init(document.getElementById('main'));

            // 设置---------------------
            var option = {
                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',
                        data : []
                    }
                ],
                yAxis : [
                    {
                        type : 'value',
                        splitArea : {show : true}
                    }
                ],
                series : [
                    {
                        name:'蒸发量',
                        type:'bar',
                        data:[]
                    },
                    {
                        name:'降水量',
                        type:'line',
                        data:[]
                    }
                ]
            };

            $.ajax({
                cache: false,
                type: "POST",
                url: "/weather", //把表单数据发送到/weather
                data: null, // 发送的数据
                dataType : "json",  //返回数据形式为json
                async: false,
                error: function(request) {
                    alert("发送请求失败!");
                },
                success: function(result) {
                    //console.log(result);
                    for (i = 0, max = result.month.length; i < max; i++) { //注意:result.month.length
                        option.xAxis[0].data.push(result.month[i]);
                        option.series[0].data.push(parseFloat(result.evaporation[i]));
                        option.series[1].data.push(parseFloat(result.precipitation[i]));
                    };

                    // 为echarts对象加载数据--------------
                    myChart.setOption(option);
                }
            });
            // 为echarts对象加载数据--------------
            //myChart.setOption(option);
        }
    );
    </script>
</body>
</html>

效果图

时间: 2024-09-21 13:09:45

flask+sqlite3+echarts2+ajax数据可视化--静态图的相关文章

flask+sqlite3+echarts3+ajax 异步数据加载

结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates |....|-- index.html | |-- app.py | |-- create_db.py 一.先准备数据 # create_db.py # 只运行一次!!! import sqlite3 # 连接 conn = sqlite3.connect('mydb.db') c = conn.

3个技巧搞定可视化信息图的色彩搭配

  虽然如今好的配色方案已经唾手可得,但想为数据可视化找到合适的配色方案,难度仍然不小.因信息图的独特属性,在保证色彩具有清晰辨识度的同时,还必须满足丰富而不凌乱的配色要求.不过即使你对色彩不敏感,用了今天这篇干货提到的3个技巧,也能轻松制作出好看的信息图. 在信息图方面,事情甚至更加棘手,因为我们要通过上千种各不相同的数据集合来传递信息,它们有着各自迥异的视觉表现. 目前的问题 我们没有立刻开始建立自己的配色表,而是发起了一些调查,研究网络上已存在的配色方案.令人惊讶的是,我们发现其中只有少数

【大数据100分】冯一村:数据可视化的魅力

"中关村大数据产业联盟"推出"大数据100分"论坛,每晚9点开始,于"中关村大数据产业联盟"微信群进行时长100分钟的交流.探讨. [大数据100分]冯一村:数据可视化的魅力 主讲嘉宾:冯一村 主持人:中关村大数据产业联盟 副秘书长 陈新河 承办:中关村大数据产业联盟 嘉宾介绍: 冯一村:海云科技创始人 .海云数据是一家做数据可视化的的初创公司.海云数据是"微软创投加速器"第四期入驻的企业. 以下为分享实景全文: 冯一村:大家

大数据产品分析:浅析数据可视化

数据可视化的发展,将改变传统的管理方式,让数据的呈现更及时.更直观.更简单. 数据可视化是什么? 数据可视化--借助于图形化手段,清晰有效地传达与沟通信息同时对数据进行交互分析. 为什么需要? 由于人类大脑在记忆能力的限制,所以我们利用视觉获取的信息量多于感官,在大数据与互联网时代,企业从传统的流程式管理方式过渡到基于数据的管理方式将会成为必然的趋势,数据可视化能够帮助分析的人对数据有更全面的认识. 常见形式 折线图.柱状图.饼图.气泡图.雷达图.热力图.树(Treemap).河流图.网络图--

Photoshop3个可视化信息图的色彩搭配技巧分享

给各位Photoshop软件的使用者们来详细的解析分享一下3个可视化信息图的色彩搭配的技巧. 教程分享: 虽然如今好的配色方案已经唾手可得,但想为数据可视化找到合适的配色方案,难度仍然不小.因信息图的独特属性,在保证色彩具有清晰辨识度的同时,还必须满足丰富而不凌乱的配色要求.不过即使你对色彩不敏感,用了今天这篇干货提到的3个技巧,也能轻松制作出好看的信息图. 在信息图方面,事情甚至更加棘手,因为我们要通过上千种各不相同的数据集合来传递信息,它们有着各自迥异的视觉表现. 目前的问题 我们没有立刻开

想做热门信息图?得先搞懂数据可视化的五虎将

  因为接下来要做卖家后台数据纵横的改版,对数据可视化这块儿又进行了研究和心得的整理,跟大家分享下数据可视化常用的五种方式,希望能给大家带来思路的拓展. 概念 借助于图形化的手段,清晰.快捷有效的传达与沟通信息.从用户的角度,数据可视化可以让用户快速抓住要点信息,让关键的数据点从人类的眼睛快速通往心灵深处. 数据可视化一般会具备以下几个特点:准确性.创新性 和 简洁性. 常用五种可视化方法 下面从最常用和实用的维度总结了如下5种数据可视化方法,让我们来一一看一下: 一.面积&尺寸可视化 对同一类

如何将枯燥的大数据呈现为可视化的图和动画?

前段时间做了一个关于诺贝尔人才流动的题,包含了可视化视频和信息图,所以用这个选题,来分享一些制作过程以及工具使用,希望能够帮助到题主和其他和对这方面感兴趣的知友. 主题:诺贝尔获奖者的流动 我们想表现的就是诺贝尔获奖者出生地与获奖时的居住地的变化,所以想到流线地图的方式,用地图直观的看到某些时间段内人才流动的变化. 数据:如何收集这个数据? 对于这个案例,毫无疑问的数据来源是诺贝尔奖的官网,上面有最详细的获奖者信息. 对于其他的选题,首选与主题相关的权威官网. 我们用Import.io工具抓了8

大数据可视化 让一张图胜过千言万语

谈到大数据,就必然要谈到可视化分析,因为大数据分析的目的是发现有价值的信息,供决策者和业务人员使用,更好地做出企业的决策. 所以每次Teradata不论在国内还是国外的峰会上,都会设置一个大数据可视化展示区域.浏览这些抽象的图形,你甚至可能把它们看成是一副副艺术作品. 当天为我讲解的是Teradata天睿公司大中华区大数据事业部华东区高级顾问张玉瑞,他还有另外一个身份"数据科学家",在他看来如何把信息传达给相应的人,这就需要一种深入浅出.图文并茂的形式,一张图甚至可以胜过千言万语. T

数据可视化:一张图胜过一千句话

信息爆炸时代,一组经过精心设计.形象生动的信息图往往要比一篇深度长文章更容易赢得眼球和青睐.在社交媒体上,你会发现,出色的可视化产品很容易就获得海量转发和分享. "媒介即讯息"这是著名媒介理论家马歇尔·麦克卢汉在20世纪时就给出的结论.在他老人家看来,媒介影响了我们思考和理解的习惯. 实践也表明,当时间紧迫或心绪浮躁时,长篇大论的文字和杂乱无序的数据往往会让人产生压迫感和厌倦感,"消化"起来也费劲. 相比之下,如果一张可视化信息图表能够做到内容有趣.逻辑清晰并且设计