DBに入っている値でグラフ生成

以前投稿したグラフ生成のJSライブラリ、
morris.jsを試してみた。

グラフを描画するJSライブラリ

DB(MySQL)に格納されている値を参照して
折れ線グラフを生成させる。

 

まず、morris.jsのベースは
examplesに入っているdays.htmlを使った。

データサンプルとして東京の過去5日分の
最高気温と最低気温を表示させるとする。

DateT MaxT MinT
2014/12/22 11 3
2014/12/21 13 4
2014/12/20 8 3
2014/12/19 10 0
2014/12/18 8 -1

 

上記のデータを直書きすれば下記のような感じだ。

<!doctype html>
<head>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.2/raphael-min.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/prettify/r224/prettify.min.js"></script>
  <script src="morris.js"></script>
  <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/prettify/r224/prettify.min.css">
  <link rel="stylesheet" href="morris.css">
  
  <meta name="viewport" content="width=device-width, initial-scale=1">

</head>
<body>
<div id="graph"></div>
<script>
var day_data = [
  {"DateT": "2014-12-22", "MaxT": 11, "MinT": 3},
  {"DateT": "2014-12-21", "MaxT": 13, "MinT": 4},
  {"DateT": "2014-12-20", "MaxT": 8, "MinT": 3},
  {"DateT": "2014-12-19", "MaxT": 10, "MinT": 0},
  {"DateT": "2014-12-18", "MaxT": 8, "MinT": -1}
];
Morris.Line({
  element: 'graph',
  data: day_data,
  xkey: 'DateT',
  ymax: '15',
  ymin: '-5',
  ykeys: ['MaxT', 'MinT'],
  labels: ['最高気温', '最低気温'],
  smooth: false,
  resize: true
});
</script>
</body>

■サンプルURL
http://516.jp/sample/graph/days.html

 

上記データがDBに入っているとしてその値をとってくる場合には
{“DateT”: “2014-12-22”, “MaxT”: 11, “MinT”: 3},
{“DateT”: “2014-12-21”, “MaxT”: 13, “MinT”: 4},
{“DateT”: “2014-12-20”, “MaxT”: 8, “MinT”: 3},
{“DateT”: “2014-12-19”, “MaxT”: 10, “MinT”: 0},
{“DateT”: “2014-12-18”, “MaxT”: 8, “MinT”: -1}

と連続している部分をループで処理をすれば良い。

本当はもっと良い書き方があるかもしれないが、
私は素人なので、PHPで下記のような感じで簡単にechoで切り分けた。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="robots" content="noindex,follow">
  <title>morrisテスト</title>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.2/raphael-min.js"></script>
  <script src="morris.js"></script>
  <script src="http://cdnjs.cloudflare.com/ajax/libs/prettify/r224/prettify.min.js"></script>
  <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/prettify/r224/prettify.min.css">
  <link rel="stylesheet" href="morris.css">
</head>
<body>

<?php
$con = mysql_connect('ホスト名', 'ユーザー名', 'パスワード');

mysql_select_db("データベース名", $con);
$quryset = mysql_query('SET NAMES utf8', $con);
$quryset = mysql_query("SELECT * FROM テーブル名");

echo "<div id='graph'></div>";
echo "<script>";
echo "var day_data = [";
while ($data = mysql_fetch_array($quryset)){
        echo "{'DateT': '" . $data[0] . "', 'MaxT':" .$data[1] . ", 'MinT':" .$data[2] . "},";
}
        echo "];";
        echo "Morris.Line({";
        echo "element: 'graph',";
        echo "data: day_data,";
        echo "xkey: 'DateT',";
        echo "ymax: '15',";
        echo "ymin: '-5',";
        echo "ykeys: ['MaxT', 'MinT'],";
        echo "labels: ['最高気温', '最低気温'],";
        echo "smooth: false,";
        echo "resize: true";
        echo "});";
        echo "</script>";

?>

</body>
</html>

■サンプルURL
http://516.jp/sample/graph/db.php

配列$data[0]に日付、$data[1]に最高気温、
$data[2]に最低気温が入っている訳です。

 

morris.jsの注意点というかカスタマイズについては
下記ドキュメントを参考にした。

Line & Area Charts(折れ線グラフ)

Bar Charts(棒グラフ)

Donut Charts(円グラフ)

 

ピックアップとして2点、
1点目はsmoothをfalseにすると折れ線グラフの滑らかさが消える。
falseにしたほうが見やすいような気がする。

2点目はresizeをtrueにするとブラウザの幅に合わせてレスポンシブになる。
もちろんHTMLにmeta viewportの記述と、cssのmax-widthの変更は必要である。

 

他にも色々とカスタマイズ出来そうなので
上記ドキュメントを参考にして試してみると面白そうだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です