目次 前へ 次へ

7.10.2 手動コールバックで日付・時間スケールを指定する

以下では、PHP の time() 関数と同様の形式でタイムスタンプ値が表現されていることを前提としています。

コールバック関数を用いて、スケールに表示するラベルの書式を整形する方法を述べます。

X スケールは一般的な整数スケールで指定します (タイムスタンプ値は整数値として表されています)。 次に、カスタムなラベル用のコールバック関数を作成し、SetLabelFormatCallback()メソッドで指定します。このコールバック関数では、タイムスタンプ値を一定の書式に変換するものです。 今回の例では、PHPの Date() 関数を使用しています。

コールバック関数の例は以下のようになります。

// タイムスタンプを分、秒に変換するコールバック
function TimeCallback($aVal) {
return
Date('H:i:s',$aVal);
}

これにより、以下のようなグラフを得られます。



図 82:整数スケールとコールバック関数を使用して日付の書式の整形を行う例 [ソース]

上記の例では、手動で X スケールを指定しています。そうすることで、X 軸の最小値と最大値がデータの最小値と最大値と合わさっています。

それぞれ表示されるラベルで SetLabelFormatCallback() が呼ばれ、関数で渡される引数はライブラリがその特定のラベルを割り当てているデフォルトのラベルです。

これは、データが、たとえば数秒で与えられたタイムスタンプを基準に表示された場合、表示された値は時間・日付の値の通常の表示方法を調整しない場合があるということです。

整数のスケールの使用では、ライブラリはデータは整数でタイムスタンプの値ではないと仮定するため、自動のスケールにあった偶数の位置になるようにラベルのポジションを決めるので、これは作動しません。

解決のための一番良い方法は手動の特定スケールでコールバックの関数と一緒に整数の Xスケールを使用することです。 スケールを設定するには、少し手動の作業が必要です。 データによって、1 つを表示させるため適切な時間でスケールが始まり終わることと、選択されたチックの間隔が偶数の数分、数時間、数日、または表示するための最適な時間範囲と一致することを確認する必要があります。

以下に、その例を掲載します。 データを基準にした時間をサンプルにすると仮定した“偽”のデータを作り、いくつかの適切なスケールとチックの間隔を設定します。 このスクリプトは、タイム データの扱いをもっと促進するため基準として使用される場合があります。

(File: timestampex01.php)
<?php
// 人間が読めるラベルのタイムスタンプの使い方と形成の仕方の例
require_once("../jpgraph.php");
require_once(
"../jpgraph_line.php");

// "fake" データ ポイントの番号
DEFINE('NDATAPOINTS',500);

// データ ポイントが毎10 秒のサンプルと仮定する
DEFINE('SAMPLERATE',10);

// タイムスタンプを時間と分に変換する X スケールの
// フォーマット関数をコールバックする。
function TimeCallback($aVal) {
return
Date('H:i', $aVal);
}

// スタート時間を取得する
$start = time();
// “スタート” 時間ちょうど前に、一番近い分のスタート時間を設定する
$adjstart = floor($start / 60);

// 範囲 (20,100) と X 位置のデータセットを作成
// ランダムをより少なくし、少ないスムーザーを作るため、
// データのシンプルな低パスを適用します
$data = array();
$xdata = array();
$data[0] = rand(20,100);
$xdata[0] = $adjstart;
for(
$i=1; $i < NDATAPOINTS; ++$i ) {
$data[$i] = rand(20,100)*0.2 + $data[$i-1]*0.8;
$xdata[$i] = $adjstart + $i * SAMPLERATE;
}

// スケールのエンド値を判断する場合、
// データ ポイントが毎10 秒でサンプル化されてデータを表記すると仮定する。
// また、偶数のラベル チックの終わりに長さを追加する。
$adjend = $adjstart + (NDATAPOINTS+10)*10;

$graph = new Graph(500,250);
$graph->SetMargin(40,20,30,50);

// そして、X スケールを明確に指定するが、自動的にY スケールを測るようにする
$graph->SetScale("intlin",0,0,$adjstart,$adjend);
$graph->title->Set("Example on TimeStamp Callback");

// コールバックを設定し、ラベルの角を調整する
$graph->xaxis->SetLabelFormatCallback('TimeCallback');
$graph->xaxis->SetLabelAngle(90);

// ラベルを5 分ごと(例、300 秒)に設定し、マイナー チックを1 分後とに設定する
$graph->xaxis->scale->ticks->Set(300,60);

$line = new LinePlot($data,$xdata);
$line->SetColor('lightblue');
$graph->Add($line);

$graph->Stroke();
?>


目次 前へ 次へ