# Flask實作_ext_21_Flask+Plotly.js ###### tags: `flask` `flask_ext` `python` `web` `plotly` :::danger 官方文件: * [plotly python](https://plot.ly/python/) * [plotly.js](https://plot.ly/javascript/) * [dash](https://dash.plot.ly/?_ga=2.165600185.723864294.1577885435-305527670.1548471508) ::: 目前資料處理所講究的是可視化,而不單純的是傳統的數字報表。可視化可以幫助使用者直觀的瞭解問題所在,但可視化除了圖表之外,還需要互動性,而不是一個靜態圖表(如SSRS),在python上有不少選擇,但個人覺得plotly是一個較佳的選擇。 plot原本是收費軟體,但幾年前開源,`plotly`、`plotly.js`、`plot dash`,多個產品線都非常實用,目前`dash`的更新已經與初學時候差異甚多,功能性更加全面,非常建議一學。 ## 說明 安裝的部份可以直接使用`pip`安裝,可參考[git](https://github.com/plotly/plotly.py): ```shell pip install plotly==4.4.1 ``` 個人使用的時候版本為3.5,目前最新已至4.4.1,但因為主要用它做json序列化的`cls`,應該是不至於有過多的差異。 而前端的引用可參考[git](https://github.com/plotly/plotly.js)上所說明的引用方式設置即可。 ```javascript <!-- Latest compiled and minified plotly.js JavaScript --> <script src="https://cdn.plot.ly/plotly-latest.min.js"></script> <!-- OR use a specific plotly.js release (e.g. version 1.5.0) --> <script src="https://cdn.plot.ly/plotly-1.5.0.min.js"></script> <!-- OR an un-minified version is also available --> <script src="https://cdn.plot.ly/plotly-latest.js" charset="utf-8"></script> ``` ## 範例 設置一個測試用的Flask專案,套件簡單,不需要過於複雜: ```shell= pip install flask plotly ``` 第1行:安裝需求套件 新增一個Python文件,命名為`pyplot.py` ```python= import json import plotly as py from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): # 設置圓餅圖資料 pie = { 'values': [100, 50, 30, 20], 'labels': ['香蕉', '蘋果', '水梨', '草莓'], 'type': 'pie' } # 將相關圖表物件以list方式寫入 graphs = [ dict( data=[ pie ], layout=dict( width='100%', height='100%' ) ) ] # 序列化 graphJSON = json.dumps(graphs, cls=py.utils.PlotlyJSONEncoder) return render_template('pyplot.html', graphJSON=graphJSON) if __name__ == '__main__': app.debug = True app.run() ``` 加入`templates`資料夾,並建立一個html文件,命名為`pyplot.html`: ```htmlmixed= <!DOCTYPE html> <html lang="en"> <head> </head> <body> <div> <div id="graph-1"></div> </div> <!-- Latest compiled and minified plotly.js JavaScript --> <script src="https://cdn.plot.ly/plotly-latest.min.js"></script> <script type="text/javascript"> var graphs = {{ graphJSON|safe }}; Plotly.plot("graph-1", graphs[0].data, graphs[0].layout || {}); </script> <meta charset="UTF-8"> <title>Title</title> </body> </html> ``` 第7行:設置一個div tag,稍後放置圖表使用 第10行:引用`plotly.js` 第12行:利用filter取用後端送來的json物件 第13行:利用`Plotly.plot`指定預放置圖表的tag、data以及layout,其中data與layout都是在後端設置好的 執行專案,確認狀況: ![](https://i.imgur.com/DUDF266.png) ## 結論 一個簡單的案例就可以看到`plotly.js`的實用性,如果是`plotly dash`的話甚至可以連javascript都不用寫就做出非常精美的看板。 另外,如果有多個圖表要放,你可以放置多個圖表物件到`graphs`內,像這樣: ```python= graphs = [ dict( data=[ xy, ], layout=dict( autosize='false', width='100%', height='100%', title='Month Daily Cost', xaxis={ 'type': 'date', 'title': 'cost date' }, yaxis={ 'title': 'cost' } ) ), dict( data=[ pie ], layout=dict( width='100%', height='100%' ) ) ] ```