LoginSignup
1
0

More than 1 year has passed since last update.

【超簡単】Flask×Chart.js ブラウザ上でグラフを表示する

Last updated at Posted at 2022-12-01

はじめに

colabでグラフを作成できたけど、flask上に表示までができない、、、という人も多いのではないでしょうか?
今回はそういった人に向けて、chart.jsを使ってPythonで扱ったデータをブラウザ上でグラフ表示する方法を紹介します!

閑静系イメージは以下になります!
スクリーンショット 2022-12-01 21.41.25.png

JS

まず、staticフォルダの中にjsフォルダを作成し、そこにgraph.jsファイルを作成しましょう!
そしてこちらのコードをそのままコピペしてください!

graph.js
let title = document.getElementById('chart_title').value;
let target = document.getElementById('chart_target').value;
let dstr = String(document.getElementById('chart_data').value);
let darr = dstr.split(',');
let dlabel = String(document.getElementById('chart_labels').value);
let larr = dlabel.split(',');
let ctx = document.getElementById('myChart').getContext('2d');
let myRadarChart = new Chart(ctx, {
    type: 'radar',
    data: {
        labels: larr,
        datasets: [{
            data:darr,//app.pyのchart_data
            backgroundColor: "rgba(255,0,0,0.2)", // 線の下の塗りつぶしの色
            borderColor: "red",                   // 線の色
            borderWidth: 2,                       // 線の幅
            pointStyle: "circle",                 // 点の形状
            pointRadius: 6,                       // 点形状の半径
            pointBorderColor: "red",              // 点の境界線の色
            pointBorderWidth: 2,                  // 点の境界線の幅
            pointBackgroundColor: "yellow",       // 点の塗りつぶし色
            pointLabelFontSize: 20,
            label: target //app.pyのchart_target
            }
        ]
    },
    options: {
        responsive: true,
        title: {                // タイトル
            display: true,      // 表示する
            fontSize: 20,       // タイトルのフォント
            text: title         //app.pyのchart_title
        },
        legend: {
            position: 'bottom', // 凡例の表示位置
            labels: {
                fontSize: 20,   // 判例のフォントサイズ
            },
        },
        scale: {
            // スケールを隠す。
            display: true,      // メモリを表示する
            ticks: {            // 目盛り
                min: 0,         // 目盛りの最小値
                max: 10,        // 目盛りの最大値
                stepSize: 1,    // 目盛の間隔
                fontSize: 12,   // 目盛り数字の大きさ
                fontColor: "purple"  // 目盛り数字の色
            },
            pointLabels: {
                fontSize: 20    // チャートラベルのフォントサイズ
            },
            angleLines: {        // 軸(放射軸)
                display: true,
                color: "maroon"
            },
            gridLines: {         // 補助線(目盛の線)
                display: true,
                color: "lime"
            }
        },
    }
});


Python

Flaskファイルに以下を記入します

app.py
import os
from flask import (
     Flask, 
     request, 
     render_template)
app = Flask(__name__)

@app.route('/graph')
def chart_do():
    c = {
        'chart_labels': "項目1, 項目2, 項目3, 項目4,項目5",
        'chart_data': "4, 7, 8, 5, 6",
        'chart_title': "グラフサンプル",
        'chart_target': "タイトル"
    }
    return render_template('graph.html', c=c)

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

これが大事です!↓

chart_data: →ここにグラフに入れたいデータを配列と似たような形で渡します!←

HTML

base.html
<!DOCTYPE html>
<html lang="ja">
   <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <link rel="stylesheet" href="../static/css/style.css">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
        {% block header %}
    	{% endblock %}
        <title>Graph Sample</title>
  </head>
  <body>
    <div class="container">
	    {% block content %}
	    {% endblock %}
    </div>    
  </body>
</html>   
graph.html
{% extends 'base.html' %}

{% block header %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script>
{% endblock %}

{% block content %}
  <div class="container">
      <div class="row my-4">
          <canvas id="myChart"></canvas>
      </div>
      <input type="hidden" id="chart_labels" name="chart_labels" value="{{ c.chart_labels }}">
      <input type="hidden" id="chart_title" name="chart_title" value="{{ c.chart_title }}">
      <input type="hidden" id="chart_target" name="chart_target" value="{{ c.chart_target }}">
      <input type="hidden" id="chart_data" name="chart_data" value="{{ c.chart_data }}">
  </div>
      <script type="text/javascript" src="static/js/graph.js"></script>
{% endblock %}

最後に

いかがでしたでしょうか?
何か不明点や編集点などありましたらご連絡ください。

参考記事

グッラフの形状を変えたい場合こちらを参照ください!
https://www.chartjs.org/docs/latest/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0