[PHP]グラフ用プログラムPHPlotのスタートから使い方まで
トップページへ
PHPでグラフをしたいと思い、色々調べた結果「PHPlot」というありがたいソフトにたどり着きました。ですが英語なので、当方のメモとしていくつか書き残したいと思います。
・利用だけなら無料。もちろん著作権はPHPlot作成者様にあります。
・著作権関係のドキュメントがありますが英語なので、当方は「基本プログラムを一切触らず」「再頒布しない」、使用するWebサイト上で「PHPlotを使用している旨の表示」を常識の範囲として遵守しました。
・この記事を参考にされるのはありがたいですが、いかなるトラブルも読者様の自己責任でお願いします。当管理人およびPHPlot作者様は責任を負いません。
Q.なぜ「PHPlot以外の他のグラフプログラム」を利用しなかったのか?
A.当方の力不足と思われますが、他のプログラムを現在のPHPのバージョンで使用するとエラーが多数出ました。
ですので、最終版が2015年ながらエラーの出ない「PHPlot」を使用させていただきました。作者様には感謝です。
Thanks to the author of PHPlot.
PHPlotの公式ダウンロードサイト
https://sourceforge.net/projects/phplot/
「Last Update: 2016-01-04」となっていますが、中身は下記の通りです
PHPlotの利用方法
・最低限必須なもの
PHPlotのプログラム
日本語フォント
サーバー上でGDが使えること
・欠点
見た目(グラフィック)としてはやや貧弱。
以下、詳しく
・PHPlotのプログラムが入ったフォルダをプログラム内から参照して使用できます。
・実行時にグラフを描画するので、他のグラフプログラムと同様にGDが有効になっていることが必要と思われます。
<?php
phpinfo();
?>
でGDが利用できるかどうか確認して下さい。
・日本語のTTFフォント(TrueType Font)が必須です。指定しないと日本語をまともに表示できません。私は文字情報技術促進協議会のIPAフォントを利用させて頂きました。
関連して「グラフのタイトルが文字化け」する場合は、
SetDefaultTTFont
で、日本語TTFフォントを指定しているかどうかをご確認下さい。
*本来はTTFなのですが、個人的にTTFフォントと呼称しています。
当方の動作確認済み環境
PHP 7.4.33(初回) ~ PHP 8.1.22 (2023.12.9時点)
PHPlotに関するドキュメント・英語のみ
http://phplot.sourceforge.net/phplotdocs/
当記事の以下のリンクは全てこのドキュメントの各ページとします。(例外は併記します)
PHPlotの学習方法
ネットにアップされていた諸先輩方の情報と公式ドキュメントで学習させていただきました(謝辞)
その時に「あまりにも情報が少ない」と感じたので、この記事を書きました。
下記は実際のプログラムソースですが、用語集を兼ねた記事のため、このままでは全く動作しません。
用語の説明
ラベル:グラフに描く数値や見出し
凡例ボックス(以下、凡例):グラフの補足として、別枠で表示するもの
//グラフを表示する画像のクラスオブジェクトの作成とサイズの指定 $plot = new PHPlot(800,600); //TTFフォントのある場所指定 $plot->SetTTFPath(dirname(__FILE__) . '/ttf/'); //TTFフォントの指定 $plot->SetDefaultTTFont('ipaexg.ttf'); //境界線の種類の指定 $plot->SetImageBorderType('plain'); //円グラフを表示する $plot->SetPlotType('pie'); //グラフデータとして渡すタイプの指定 $plot->SetDataType('text-data-single'); //実際のデータをセット 中身は配列データ $plot->SetDataValues($data); //色をセット $plot->SetDataColors(array('orange', 'yellow', 'cyan', 'red', 'magenta', 'green', 'lavender', 'brown', 'gray', 'pink')); //上部のグラフタイトルの指定 //タイトルのフォント指定 $plot->SetFont( 'title', null, 10); $str = 'グラフタイトル'; $plot->SetTitle($str); //凡例ボックスを表示する場合 foreach ($data as $row){ $plot->SetLegend(implode(': ', $row)); } //凡例ボックスの位置 $plot->SetLegendPixels(30, 30); //凡例のレイアウト http://phplot.sourceforge.net/phplotdocs/dev-legend.html //凡例内を左寄せ $plot -> SetLegendStyle('left', 'left'); //サンプル 凡例をグラフ内のどこに表示するのか? http://phplot.sourceforge.net/phplotdocs/ex-legendpos.html //棒グラフと円グラフの影のサイズ $plot -> SetShading(0); //X軸ラベルの角度 $plot->SetXLabelAngle(30); //X軸ラベルの位置 $plot->SetXDataLabelPos('plotup'); //グリッド 未検証 $plot->SetDrawDashedGrid('False'); //X軸ラベルの書式設定 データはUnixタイムスタンプ(日付時刻型) $plot->SetXLabelType('time', '%m/%d'); ※実行サンプル //X軸から点線を描く場合 $plot->SetDrawXDataLabelLines(True); //円グラフのラベル位置の調整 $plot -> SetLabelScalePosition(0.4); //ラベルのカスタマイズ //参考 http://phplot.sourceforge.net/phplotdocs/ex-pielabeltype.html //独自関数 function mycallback($str) { list($percent, $label) = explode(' ', $str, 2); return sprintf('%s (%.1f%%)', $label, $percent); } //円グラフにラベルを表示 $plot->SetPieLabelType(array('percent', 'label'), 'custom', 'mycallback'); //ラベルサイズ指定 初期値 generic:8, legend:8, title:14, xy_label:6, xy_title:10 $plot->SetFont('title', null, 12); // グラフの表示範囲を決める。例えば 水平棒グラフで X値は10~100の範囲と指定 $plot->SetPlotAreaWorld(10, NULL, 100); //Y軸の目盛りの間隔 $plot->SetYTickIncrement(1); //Y軸タイトル $plot->SetYTitle('件数'); //Y軸ラベルの表示非表示 $plot->SetYTickLabelPos('none'); //Y軸の目盛りを表示非表示 $plot->SetYTickPos('none'); //Yの値を小数点以下3桁、%を付加 $plot->SetYLabelType('data', 3,'','%'); //グラフを出力 最終処理 $plot->DrawGraph(); ?>
グラフの表示について
現時点で筆者がわかっている方法として
A 「グラフ生成のphp」を実行し、pngなど画像として出力する。
B 「グラフ生成のphp」を実行し画面に表示。
C HTMLを出力するphp内で「グラフ生成のphp」も実行し、生成したHTMLとともに画像も出力する。
の計3つの方法があります。
PHPlotで作成したグラフの実行例
そのサイトのトップページのグラフ画像は前述の「A」、各自治体ページ内の[●●グラフ]というボタンは「B」、各自治体ページ内で初期表示のグラフは「C」です。
また、そのサイトで実行しているグラフの種類は下記の通りです。
・縦棒グラフと折れ線グラフ
・円グラフ
・積み上げ縦棒グラフ
・同日に数値の異なる2本の縦棒グラフ(参考にした公式サンプル)
見た目はExcelや他のPHP用グラフ(JpGraphi, PChart)より劣って見えるかもしれませんが、とりあえず「表示したいデータがあって、Webでグラフを簡単に表示したい」という場合には、PHPlotは便利だと思います。私のようなPHP初心者でもなんとか動作しているので、英語のドキュメントなら訳して読める、という方なら大丈夫だと思います。
懸念事項
作成者様(海外)の方がUpdateをされていないので、今後のPHPのUpdate内容によっては「最悪、動作しない可能性がある」点が懸念材料です。
また、懸念ではありませんし保証はできませんが、マイナーな分、セキュリティリスクは低いかもしれません。
処理の概要(流れ)
・配列に値をセット
・phplotをnewで定義
・日本語フォントの指定
・グラフの種類の指定
・配列をphplotにセット
・グラフの詳細の設定
・グラフの描画
「newで定義」「描画」以外は処理が多少、前後しても問題はないと思います。また、練習用としては、データ量が少なくても表示できる「円グラフ(凡例なし)」がオススメです。
グラフの種類 実際のサンプルコード
●印は管理人のお気に入り
円グラフ Pie Chart(凡例なし)
http://phplot.sourceforge.net/phplotdocs/ex-pie2.html
凡例のある円グラフ
http://phplot.sourceforge.net/phplotdocs/ex-pie1.html
●棒グラフ/Bar Chart
http://phplot.sourceforge.net/phplotdocs/ex-bars1.html
●前述のグラフの2D版
http://phplot.sourceforge.net/phplotdocs/ex-bars2.html
積み上げ縦棒グラフ
http://phplot.sourceforge.net/phplotdocs/ex-stackedbars1.html
●積み上げ縦棒グラフに数値あり
http://phplot.sourceforge.net/phplotdocs/ex-stackedbars3.html
水平棒グラフ
http://phplot.sourceforge.net/phplotdocs/ex-horizbar.html
●水平積み上げ棒グラフ
http://phplot.sourceforge.net/phplotdocs/ex-horizstackedbar.html
折れ線グラフ/Line Plot
http://phplot.sourceforge.net/phplotdocs/examples.html#ex-lines1
●折れ線グラフと積み上げ棒グラフ
http://phplot.sourceforge.net/phplotdocs/ex-outbreak.html
注釈を入れる
http://phplot.sourceforge.net/phplotdocs/ex-annotate.html
1度に2種の棒グラフを表示
http://phplot.sourceforge.net/phplotdocs/ex-twoplot1.html
データ値付き棒グラフ
http://phplot.sourceforge.net/phplotdocs/ex-bars4.html
折れ線グラフの点にデータ値を付加する
http://phplot.sourceforge.net/phplotdocs/ex-linepoints2.html
その他
テキストの行間
http://phplot.sourceforge.net/phplotdocs/SetLineSpacing.html
使える色とその名称
http://phplot.sourceforge.net/phplotdocs/conc-colors.html
タイトルで改行 \nを入れる
凡例
凡例内のマークを四角形または、折れ線グラフと同じマーカーを使用する。
ただしグラフの種類が「Points/LinePoints/Lines/Squared」の時のみ有効で、それ以外のグラフでは指定をしても無視されます
補足:
Point Shapes:凡例の中のポイント形状のことで◆、●、▲など。マーカー付折れ線グラフなど
Line markers:凡例の中のラインのことで色違いの─。通常の折れ線グラフなど
サンプル5.35において
require_once ‘legendshape.php’;
と別途のPHPファイルを必要とする記述がありますが、PHPlotの最新バージョンではその一文は不要。
$plot -> SetLegendUseShapes(True);
のみで凡例に▲や色付きの─が表示されたので、おそらく基本ファイル内に組み込まれていると思われます。