PHPとJpGraphで人口ピラミッドを表示する

(1/1)
JpGraph は PHP のライブラリの一種で、Excel のように簡単にグラフを作成できる。QPL 1.0 (Qt Free Licensee)ライセンスにしたがい、コミュニティや教育などの非営利目的での使用に限り無料で利用できる。
ぱふぅ家ホームページでは、JpGraph を使ってアクセス回数の推移などを表示している。
今回は、JpGraph を用い、日本の人口ピラミッドを表示させるプログラムを作ってみることにする。

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

準備

まず、JpGraph を使うための準備をする。
space
JpGraph は、国内ではアシアル株式会社がサポートしており、同社のサイトからダウンロードできる
解凍したら、PHP から利用できるディレクトリにコピーしておく。凡例やラベルに日本語を使う場合は、事前に日本語フォント(TrueType ファイル)を用意しておく必要がある。
これについても、アシアル社のサイトに詳しい説明がある

データの準備

人口ピラミッドを描くために必要な日本の人口データは、総務省統計局のサイトからダウンロードできる
Excel データとしてダウンロードできるので、テキストエディタを使って PHP の配列変数に取り込めるようにしておく。

解説:JpGraphの準備

0009: //JpGraph
0010: require_once("../../../../common/jpgraph/jpgraph.php");

まず、関数  require_once  を用いて JpGraphライブラリを読み込む。ディレクトリは、各自が JpGraph をインストールしている場所を指定すること。
"jpgraph.php" は共通ライブラリ。もう 1 つはグラフの種類によって読み込むライブラリが異なる。今回は棒グラフを用いるので "jpgraph_bar.php" を読み込む。
space
詳細は、アシアル社のサイトからダウンロードした圧縮ファイルに含まれる日本語ドキュメント(HTML 形式)を参照のこと。

解説:データの準備

0023: //年齢階層別日本人人口推計値(平成17年4月1日確定値)
0024: // http://www.stat.go.jp/data/jinsui/
0025: $age  = array("0-", "5-", "10-", "15-", "20-", "25-", "30-", "35-", "40-", "45-", "50-", "55-", "60-", "65-", "70-", "75-", "80-", "85-");
0026: $male = array(2894,2998,3068,3378,3812,4301,4886,4310,3946,3851,4448,4898,4123,3486,2980,2204,1178,801);
0027: $female = array(2746,2857,2919,3203,3611,4117,4765,4234,3893,3828,4481,5017,4395,3853,3544,2953,2144,2049);
0028: 
0029: //人口ピラミッドは年齢の高い方が上なので配列を逆転させる
0030: $age    = array_reverse($age);
0031: $male   = array_reverse($male);
0032: $female = array_reverse($female);
0033: 
0034: //女性は負数扱い
0035: foreach ($female as $key=>$val$female[$key] = (0 - $val);

総務省からダウンロードしたデータは、年齢階層を配列 $age に、男性人口を配列 $male に、女性人口を配列 $female に代入するようにしてある。
space
人口ピラミッドは、年齢階層が高い方が上になる。当初の配列の順序では逆になってしまうので、関数  array_reverse  を使って配列の順序を逆転させておく。
space
人口ピラミッドを描くには、水平棒グラフを使う。
グラフの中央をゼロとして、右側が男性人口、左側が女性人口である。男性人口は正数、女性人口は負数として水平グラフを描けば、人口ピラミッドとなるはずである。
そこで、あらかじめ女性人口を負数にしておく。

解説:グラフの作成・描画

0037: //JpGraphでグラフを生成する
0038: $graph = new Graph(400, 500, "auto");
0039: $graph->SetScale("textlin");
0040: 
0041: //グラフを90度横に倒す
0042: $top    = 50;
0043: $bottom = 50;
0044: $left   = 50;
0045: $right  = 50;
0046: $graph->Set90AndMargin($left$right$top$bottom);
0047: 
0048: //男性の棒グラフを準備する
0049: $PlotMale = new BarPlot($male);
0050: $PlotMale->SetFillColor("blue");
0051: $PlotMale->SetWidth(1.0);
0052: $PlotMale->SetLegend(conv("男性"));
0053: 
0054: //女性の棒グラフを準備する
0055: $PlotFemale = new BarPlot($female);
0056: $PlotFemale->SetFillColor("red");
0057: $PlotFemale->SetWidth(1.0);
0058: $PlotFemale->SetLegend(conv("女性"));
0059: 
0060: //2つの棒グラフを結合する
0061: $graph->Add($PlotMale);
0062: $graph->Add($PlotFemale);
0063: 
0064: //タイトル、軸の表示
0065: $graph->title->SetFont(FF_PGOTHIC);
0066: $graph->title->Set(conv("人口ピラミッド"));
0067: 
0068: $graph->xaxis->SetPos('min');
0069: $graph->xaxis->title->SetFont(FF_PGOTHIC);
0070: $graph->xaxis->title->Set(conv("年齢"));
0071: $graph->legend->SetFont(FF_PGOTHIC);
0072: 
0073: $graph->yaxis->title->SetFont(FF_PGOTHIC);
0074: $graph->yaxis->SetLabelFormatCallback('yScaleCallback');
0075: 
0076: $graph->xaxis->SetFont(FF_PGOTHIC);
0077: $graph->xaxis->SetTickLabels($age);
0078: 
0079: //グラフを表示する
0080: $graph->Stroke();

JpGraph は、グラフを Graph オブジェクトとして扱う。
まず、新しいグラフオブジェクト $graph を生成する。ここではグラフ描画領域を横 400 ドット×縦500 ドットとしている。
space
JpGraph では水平棒グラフは扱えない。そこで、通常の棒グラフを描いたグラフ領域全体をメソッド Set90AndMargin により 90 度横に倒すことで実現する。
この際、描画領域境界からのマージン($top, $bottom, $left, $right)を設定しておく必要がある。
space
男性と女性は、別々のグラフとして描く。まず男性のグラフである。
BarPlot メソッドで棒グラフ・オブジェクトを生成する。棒グラフの間隔はゼロにする。
space
メソッド SetLegend はグラフの凡例を定義する。
ここでは日本語を使っているが、TrueType フォントを使うので UTF-8 でエンコードしてやる必要がある。女性のグラフも同様である。
space
メソッド Add を使い、グラフオブジェクト $graph に男性のグラフと女性のグラフを結合する。グラフのタイトルや軸名称も設定する。
space
日本語フォントファイルを導入し、FF_PGOTHIC に対して日本語フォントを対応づけていれば、日本語表示が可能であるはずである。ただし、日本語の指定は UTF-8 コードで行うこと。これは、「PHP で TrueType フォントを利用する」で述べたのと同じ理由による。
space
最後に、Storoke メソッドを使って画面にグラフを表示する。

参考書籍

参考サイト

(この項おわり)
header