Python Web框架--框架Flask--PyCharts(四)

一瑟捣、安裝pyecharts

??Echarts 是一個由百度開源的數(shù)據(jù)可視化馋艺,憑借著良好的交互性,精巧的圖表設(shè)計迈套,得到了眾多開發(fā)者的認(rèn)可丈钙。而 Python 是一門富有表達(dá)力的語言,很適合用于數(shù)據(jù)處理交汤。當(dāng)數(shù)據(jù)分析遇上數(shù)據(jù)可視化時,pyecharts 誕生了。

特性:
簡潔的 API 設(shè)計芙扎,使用如絲滑般流暢星岗,支持鏈?zhǔn)秸{(diào)用
囊括了 30+ 種常見圖表,應(yīng)有盡有
支持主流 Notebook 環(huán)境戒洼,Jupyter Notebook 和 JupyterLab
可輕松集成至 Flask俏橘,Sanic,Django 等主流 Web 框架
高度靈活的配置項圈浇,可輕松搭配出精美的圖表
詳細(xì)的文檔和示例寥掐,幫助開發(fā)者更快的上手項目
多達(dá) 400+ 地圖文件,并且支持原生百度地圖磷蜀,為地理數(shù)據(jù)可視化提供強有力的支持

V1:僅支持 Python3.6+

文檔示例:http://pyecharts.herokuapp.com/
官網(wǎng):https://github.com/pyecharts/pyecharts

二召耘、安裝PyEcharts

pip install pyecharts -U

安裝組件:


Scatter3D

二、顯示PyCharts

  1. Web直接顯示
from flask import Flask
from pyecharts.charts import Bar
from pyecharts import options as opts
from flask import Markup

app = Flask(__name__)
app.config["DEBUG"] = True

# 定義條圖
def bar_base() -> Bar:
    c = (
        Bar()
            .add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
            .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
            .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
            .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副標(biāo)題"))
    )
    return c

# 路由
@app.route("/")
def index():
    c = bar_base()
    return Markup(c.render_embed())

if __name__ == '__main__':
    app.run()  # 設(shè)置debug=True是為了讓代碼修改實時生效褐隆,而不用每次重啟加載
Web直接顯示
  1. Flask 前后端分離
    在 templates 文件夾中新建一個 index.html 的文件污它,其中主要用到了 jquery 和 pyecharts 管理的 echarts.min.js 依賴。
    1)前端頁面
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>動態(tài)更新數(shù)據(jù)</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
<div id="bar" style="width:1000px; height:600px;"></div>
<script>
    (function() {
            var result_json = '{{ result_json|tojson }}';
            // var result = JSON.parse(result_json);
            var chart = echarts.init(document.getElementById('bar'), 'gray', {renderer: 'canvas'});
            // ajax請求
            $.ajax({
                type: "GET",
                url: "http://127.0.0.1:5000/barChart",
                dataType: 'json',
                data: {result: result_json},
                success: function (result) {
                    chart.setOption(result);
                }
            });
        })();
</script>
</body>
</html>

2)后端代碼

from flask import Flask
from flask import render_template
# http請求庫
from flask  import request

# pyecharts 庫
from pyecharts import options as opts
from pyecharts.charts import Bar

app = Flask(__name__)
app.config["DEBUG"] = True

# 根路徑庶弃,渲染模板index.html
@app.route("/")
def index():
    data = request.args.to_dict()
    print(data)
    return render_template("index.html", result_json=data)

# 定義標(biāo)題參數(shù)繪制條圖的函數(shù)
def bar_base(name,subtitle) -> Bar:
    c = (
        Bar()
            .add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
            .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
            .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
            # 顯示動態(tài)標(biāo)題
            .set_global_opts(title_opts=opts.TitleOpts(title=name, subtitle=subtitle))
    )
    return c

@app.route("/barChart")
def get_bar_chart():
    # 接受請求參數(shù)
    args = request.args.to_dict()
    result = eval(args.get("result"))
    name = result.get("name")
    subtitle = result.get("subtitle")
    c = bar_base(name, subtitle)
    return c.dump_options_with_quotes()

if __name__ == '__main__':
    app.run()  # 設(shè)置debug=True是為了讓代碼修改實時生效衫贬,而不用每次重啟加載

  1. 瀏覽測試
    請求地址:http://127.0.0.1:5000/?name=test&subtitle=test
    必須添加請求參數(shù)。
    瀏覽測試
  1. 動態(tài)數(shù)據(jù)顯示
    1)前端頁面
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>動態(tài)更新數(shù)據(jù)</title>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
<div id="bar" style="width:1000px; height:600px;"></div>
<script>
    var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
    // 每2秒更新一次
    $(
        function () {
            fetchData(chart);
            setInterval(fetchData, 2000);
        }
    );

    // 定義函數(shù)歇攻,從后臺獲取數(shù)據(jù)
    function fetchData() {
        $.ajax({
            type: "GET",
            url: "http://127.0.0.1:5000/barChart",
            dataType: 'json',
            success: function (result) {
                chart.setOption(result);
            }
        });
    }
</script>
</body>
</html>

2)后端代碼

from flask import Flask
from flask import render_template
# 隨機(jī)函數(shù)
import random

# pyecharts 庫
from pyecharts import options as opts
from pyecharts.charts import Bar

app = Flask(__name__)
app.config["DEBUG"] = True

# 根路徑固惯,渲染模板index.html
@app.route("/")
def index():
    return render_template("index.html")

# 隨機(jī)數(shù)據(jù)條圖
def bar_base() -> Bar:
    c = (
        Bar()
            .add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
            .add_yaxis("商家A", [random.randint(10, 100) for _ in range(6)])
            .add_yaxis("商家B", [random.randint(10, 100) for _ in range(6)])
            .set_global_opts(title_opts=opts.TitleOpts(title="", subtitle=""))
    )
    return c

@app.route("/barChart")
def get_bar_chart():
    c = bar_base()
    return c.dump_options_with_quotes()

if __name__ == '__main__':
    app.run()  # 設(shè)置debug=True是為了讓代碼修改實時生效,而不用每次重啟加載

3)瀏覽顯示


瀏覽顯示
  1. 使用變量獲取數(shù)據(jù)
    1)html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圖表示例</title>
    <style>
        .charts {
            /*background-color: red;*/
            height: 500px;
            width: 600px;
        }
    </style>
    <script src="../static/js/echarts.min.js"></script>
</head>
<body>
<div id="charts" class="charts"></div>
<div id="data" style="display: none">{{list}}</div>
<script>
    var list = document.getElementById("data");
    var d = document.getElementById("charts");

    //  初始化圖表
    var chart = echarts.init(d);
    option = {
        title: {
            text: '第一個小例子'
        },
        tooltip: {},
        legend: {
            data: ['銷量']
        },
        xAxis: {
            // 讀取后臺數(shù)據(jù)轉(zhuǎn)為json
            data: JSON.parse(list.innerText)
        },
        yAxis: {},
        series: [{
            name: '銷量',
            type: 'bar',
            data:  [35, 20, 56, 100, 80, 64]
        }]
    };
    chart.setOption(option);
</script>
</body>
</html>
  1. python數(shù)據(jù)
from  flask import Flask, url_for, request, jsonify, render_template

# json 解析
import json

app = Flask(__name__)

@app.route("/charts")
def getCharts():
    data = ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]
    # 必須使用json.dumps進(jìn)行轉(zhuǎn)換 json.dumps是將一個Python數(shù)據(jù)類型列表進(jìn)行json格式的編碼解析
    # 否則雙引號會轉(zhuǎn)為單引號缴守,導(dǎo)致前臺無法解析此內(nèi)容
    return render_template("charts.html", list=json.dumps(data))


if __name__ == "__main__":
    # 啟動flask
    app.run(port=9999, debug=True)

  1. 瀏覽訪問


    瀏覽訪問
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葬毫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斧散,更是在濱河造成了極大的恐慌供常,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸡捐,死亡現(xiàn)場離奇詭異栈暇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)箍镜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門源祈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人色迂,你說我怎么就攤上這事香缺。” “怎么了歇僧?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵图张,是天一觀的道長锋拖。 經(jīng)常有香客問我,道長祸轮,這世上最難降的妖魔是什么兽埃? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮适袜,結(jié)果婚禮上柄错,老公的妹妹穿的比我還像新娘。我一直安慰自己苦酱,他們只是感情好售貌,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疫萤,像睡著了一般颂跨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上给僵,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天毫捣,我揣著相機(jī)與錄音,去河邊找鬼帝际。 笑死蔓同,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹲诀。 我是一名探鬼主播斑粱,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脯爪!你這毒婦竟也來了则北?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤痕慢,失蹤者是張志新(化名)和其女友劉穎尚揣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掖举,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡快骗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了塔次。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片方篮。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖励负,靈堂內(nèi)的尸體忽然破棺而出藕溅,到底是詐尸還是另有隱情,我是刑警寧澤继榆,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布巾表,位于F島的核電站汁掠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏攒发。R本人自食惡果不足惜调塌,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惠猿。 院中可真熱鬧,春花似錦负间、人聲如沸偶妖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾访。三九已至,卻和暖如春董虱,著一層夾襖步出監(jiān)牢的瞬間扼鞋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工愤诱, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留云头,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓淫半,卻偏偏與公主長得像溃槐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子科吭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容