PHPlot グラフ表示

PHPlot ロ-ソク足チャ-ト-その3

それでは引き続き、PHPlot ロ-ソク足チャ-ト CSV 読込ファイル phplot-candle-5.php を作成します。
作成ファイル内容は、
63Pear Village に戻り
左サイドナビ「PHPlot グラフ表示」の中の
PHPlot ロ-ソク足チャ-ト CSV 読込 PHP ファイル
から見てください。

PHPlot ロ-ソク足チャ-ト PHP ファイルとの差分

PHPlot ロ-ソク足チャ-トファイルでは表示データは
$data1 = array(
array('4/1',16),
・・・・・・
array('10',19)
);
の様な形式で一つ一つ設定していました。
これでは、大変なので、CSV ファイルを読込んで、ロ-ソク足チャ-トの作成をします。
ここで、使用する
CSV ファイル can_line_data.csv
はファイル名をクリックすると CSV ファイルを開いたり、保存したりすることができます。

CSV ファイルの作り方

みなさんは CSV ファイルを作るときどのように作成しますか?
エクセルファイルを作成してそれを CSV ファイルに変換する方も多いのではないかと思います。
そんなときできあがった CSV ファイルには、 数値欄の表示形式を数値-少数点以下の桁数を 2 のように設定していると 数値の後に半角空白が 1文字入ってしまいます。
Pear::Image_Graph ではこの半角空白は無視してくれたのですが、PHPlot では無視してくれません。
要するに数値とは見なさないのでグラフがかけないのです。
数値の前の半角空白は無視してくれるようです。
エクセルにおいては数値欄の表示形式を文字列とするとこの問題は回避できます。

CSV ファイルからグラフデータを読み込む

CSV ファイルからデータを読み込む方法は、
63Pear Village に戻り
左サイドナビ「Pear::Image_Graph その2」の中の
Image_Graph その2 グラフ値表示ファイル作成
と基本的には同じです。
最初に CSV ファイルを読み込みます。
$filepath = "file/can_line_data.csv";
ファイルのあるフォルダ名とファイル名を設定します。
そしてインスタンスを定義します。
$file = new SplFileObject($filepath);
次ぎに、CSV 列として行を読み込みができるようにフラグをセットします。
$file -> setFlags(SplFileObject::READ_CSV);
これで指定した CSV ファイルからのデ-タが取得可能となります。
$file の中にはオブジェクトとして CSV ファイルからのデ-タが格納されますので ここから配列として読み出します。
foreach は、配列を反復処理するための便利な方法です。
foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。
foreach ($file as $key => $line)
と書くと各反復において現在の要素の値が $line に代入され、 さらに現在の要素のキーを変数 $keyに代入します。
そして、 内部配列ポインタが一つ前に進められます。
よって、次の反復では次の要素を見ることになります。
もし、
foreach($line as $str)
と書くと各反復において現在の要素の値が $strに代入され、 内部配列ポインタが一つ前に進められます。

  foreach($file as $key => $line){
   foreach($line as $str){
    $records[$key][] = $str; 
   }
  }

具体的には $key は 0~1~2~3~ のように変化していきます。
例えば $key = 1 のとき
$records[$key][0] = 4/1
$records[$key][1] = 18.37
となります。

文字化け防止-必要なし

前項 CSV ファイルの読み込み過程で
$str1 = mb_convert_encoding
 ($str,"UTF-8","sjis-win");
なる命令は必要ありません。
必要なデ-タは全て半角英数字だからです。
エクセルで CSV ファイルを作成すると文字コ-ドは SHIFT-JIS で保存されています。
正確に言うと sjis-win で保存されているようです。
でも、半角英数字は SHIFT-JIS も UTF-8 も同じコ-ドなので、今回は変換の必要はありません。

必要なデ-タを for 文で抜き取る

必要なグラフ値デ-タを読み出した CSV デ-タ $records[ ][ ] から抜き出します。
CSV デ-タの構成は、

CSV ファイル can_line_data.csv

のようになっていますので、グラフを描くのに必要なデ-タは
[1][0] = 4/1 ~
[10][5] = 19 の
10×6 = 60個のデ-タ
であることがわかります。
よって、これらのデ-タを for 文で抜き出して
ロ-ソク足デ-タ $Data[0]~[9] と
折線デ-タ $Data1[0]~[9]
のデ-タオブジェクト
に入れます。
これをファイル化すると

  $last_l = count($records) - 1;

  for($k1 = 1;$k1 < $last_l; $k1++){
   $data[$k1-1] = array(
    trim($records[$k1][0]),
    trim($records[$k1][1]),
    trim($records[$k1][2]),
    trim($records[$k1][3]),
    trim($records[$k1][4]));
  }
  for($k1 = 1;$k1 < $last_l; $k1++){
   $data1[$k1-1] = array(
    trim($records[$k1][0]),
    trim($records[$k1][5]));
  }

となります。

$last_l は何?

count($records)とすると
引数 $records に含まれる項目数を返します。
引数が配列でない場合には「1」の値を返します。
今回の場合 $records は2次元配列ですので、まずは、「1」としてカウントした後で、実際は配列ですので、 配列に含まれる個数 $records[0][]~$records[10][] すなわち「11」を加えるという挙動をします。
すなわち、
1 + 11 = 12
となります。
よって
$last_l = count($records) - 1;
とすると
$last_l = 11
となります。
よって $k1 は、1,2,3,・・・・9,10 と変化して終わります。

trim は必要?

PHP 関数の trim( ) はなぜ必要なのでしょうか?
trim 関数はカッコ内の文字列の先頭および末尾にあるホワイトスペース(空白文字)を取り除き 取り除かれた文字列を返します。
でもなんで、trim は必要なのでしょうか?
前項 CSV ファイルの作り方のところでも説明しましたが、 エクセルファイルを作成してそれを CSV ファイルに変換すると
エクセルで数値欄の表示形式を数値-少数点以下の桁数を 2 のように設定していると 数値の後に半角空白が 1文字入ってしまうからです。
この空白文字があると PHPlot がうまく動いてくれません。
仕方がないので、この半角空白を取り除くために、trim 関数を使っています。

できあがった配列の確認

それでは、できた配列
ロ-ソク足デ-タ $Data[0]~[9] と
折線デ-タ $Data1[0]~[9]
がうまくできあがっているか確認したいと思います。
echo "ロ-ソク足 $ data=<pre>";
print_r($data);
echo "</pre>";
echo "折線 $ data1=<pre>";
print_r($data1);
echo "</pre>";
のように書くと配列の内容をうまく WEB 上に表記してくれますね。
もっともこの確認は必要ないものなので、後で削除しておきましょう。
ちなみに、print_r( ) は、指定した式に関する情報を解りやすく出力してくれる便利な PHP 関数でしたね。
配列というのは1つの変数にキー(添字)で複数の値を持たせているため、 ただ単に配列名(変数名)で出力しただけでは配列の中のどの値を指しているのか分からないので 正確な値が出力できないのです。
だから、print_r( ) 関数を使います。
print_r() 関数は出力した時見やすいように勝手に、改行文字や半角スペースを入れてくれます。
この時、<pre>タグを使うと <pre>~</pre> は~内の改行や半角スペースが連続していても それもきちんと表示してくれます。
よって、print_r() と <pre>タグ を連携して使用すると、配列の内容をうまく WEB 上に表記してくれるのです。

これで、PHPlot ロ-ソク足チャ-ト ファイル作成では直接行っていた表示デ-タの設定を CSV ファイルから読み込むよう変更することができました。
残りの部分は、保存するグラフのファイル名を
sample4.png ⇒ sample5.png
に変更している部分を除き、
PHPlot ロ-ソク足チャ-ト PHP ファイル phplot-candle-4.php
と同じです。

以上で、PHPlot ロ-ソク足チャ-ト-その3 の説明は終わりです。
引き続き、作成したファイルの動作確認をしていきます。


PHPlot グラフ表示 ファイル動作確認 に進む
PHPlot ロ-ソク足チャ-ト-その2 に戻る

63Pear Villageに戻る