概要
- Dash plotlyを、既存のweb applicationに組み込む方法がわからず四苦八苦していた
- そんな中、plotly.jsの存在を知り、「jsサイドでplotly呼び出して使えばいいじゃん」となり、flaskのtutorialとplotly.jsを組み合わせて使ってみました。
- 既存のweb applicationに組み込むのは、simpleにデータをクライアント側に送って、jsにレンダリングさせるのが一番楽そうだなと思いました。
以下、flaskで作成したweb applicationに sample graphをレンダリングするコードを紹介いたします。
(Plotly Dashも別に組み込めるよ、などの有識者のご意見お待ちしております。)
コード
server側でデータを送信する関数を用意する。
@bp.route("/get_sample_data", methods=("GET",))
def get_sample_data():
# import pdb; pdb.set_trace()
out = {"y": [0, 14, 3, 17]}
return out
index.html
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
...中略...
{% block graphs %}
<button id="get_data_button"></button>
<div hidden class="result"></div>
<!-- 1. plotly.jsの内容を`#graphDiv`の要素にレンダリングする。 -->
<div id="graphDiv" class="graph">Plotly test</div>
<script>
var data = [{
x: [1999, 2000, 2001, 2002],
y: [10, 15, 13, 17],
type: 'scatter'
}];
//ボタンが押されたらAJAXで非同期通信を実行し、サーバサイドからデータを取得する。
$(function(){
$("#get_data_button").on("click", function(){
$.ajax({
url:'/get_sample_data',
type:'GET',
})
.done((res) => {
$('.result').html(res);
console.log(res);
data.push({
x: [1999, 2000, 2001, 2002],
y: res.y, // res == {"y": [0, 14, 3, 17]} in get_sample_data function in blog.py
type: 'scatter'
});
Plotly.newPlot(graphDiv, data, layout);
}) // check arrow function
}).fail((res) => {
$('.result').html(res);
console.log(res);
})
}
)
var graphDiv = document.getElementById('graphDiv')
var layout = {
height: 500,
title: 'Sales Growth',
xaxis: {
title: 'Year',
showgrid: false,
zeroline: false
},
yaxis: {
title: 'Percent',
showline: false
}
};
Plotly.newPlot(graphDiv, data, layout);
</script>
{% endblock %}
ざっくり解説
一つ一つ分解して説明します(随時更新予定)
-
plotly.jsの内容を
#graphDiv
の要素にレンダリングする。 -
#get_data_button
をid
にもつ<button>
を押すと、flask applicationにAJAXでGET通信からget_sample_data()
を実行してデータを返す。 -
データを取得して、
data
listにpush(res)
し、再度Plotly.newPlot(graphDiv, data, layout);
を実行する。
tutorialで詰まったところ、
-
Plotly.jsでは、rendering先を
<div>
タグにしないと読み込んでくれないようです。(を使ってもplotly.jsが描画してくれない。) -
出力されるグラフのCSSに関して
-
#graphDiv
に関してサイズを変更するようにコーディングしてたが全くサイズ変更されず、とても困った。 -
Plotly.newPlot(graphDiv, data, layout);
でlayoutにheight, widthキーを追加してあげればOKでした。 - (単純にCSSの知識が足りないなと思いました...)
-