サンプル・プログラムの実行例

サンプル・プログラム
poppyramid.php | サンプル・プログラム本体。 |
population2011.csv | 統計データ 2011年版 |
population2017.csv | 統計データ 2017年版 |
population2018.csv | 統計データ 2018年版 |
population2019.csv | 統計データ 2019年版 |
population2020.csv | 統計データ 2020年版 |
population2021.csv | 統計データ 2021年版 |
population2022.csv | 統計データ 2022年版 |
population2023.csv | 統計データ 2023年版 |
バージョン | 更新日 | 内容 |
---|---|---|
2.1.4 | 2025/01/19 | データを2023年版に更新, PHP8.4対応 |
2.1.3 | 2023/12/20 | データを2022年版に更新 |
2.1.2 | 2023/05/04 | データを2021年版に更新 |
2.11 | 2022/11/01 | データを2020年版に更新 |
2.1 | 2022/02/19 | PHP8対応,リファラ・チェック追加 |
準備:JpGraphの導入

JpGraph は、国内ではアシアル株式会社がサポートしており、同社のサイトからコミュニティ版をダウンロードできる。QPL (Qt Free License) 1.0ライセンスの下で、非営利目的で使用する場合は無料で利用できる。
解凍したら、PHPから利用できるディレクトリにコピーしておく。
JpGraph の使用に際しては、GDライブラリがインストールされていることが前提となる。

JpGraph は複数のPHPプログラムから成り立っているが、さまざまな場所にあるプログラムから呼ばれることになるだろうから、相対パスで指定することが面倒である。
PHPには、外部ファイルを読み込むためのオプション設定 include_path が用意されている。この機能を利用するといいだろう。
設定ファイル php.ini に記述してやる。Linux環境であれば、以下のようにセミコロン ; を介して複数のパスを設定する。
include_path=".:/php/includes;/php/jpgraph"Windows環境であれば、以下のように記述する。
include_path=".;c:\php\includes;c:\php\jpgraph"include_path は、 require_once のほか、 require 、 include 、 fopen 、 file 、 readfile 、 file_get_contents に影響を及ぼす。
実行時にオプション値を設定したい場合は、組み込み関数 set_include_path を利用する。
具体的には、下記のようにフォント・ファイルを格納したフォルダを "jpg-config.inc.php" の定数 TTF_DIR および MBTTF_DIR に設定してやる。
ここで定義しているのはIPAの無償ファイルフォントで、文字情報技術促進協議会のIPAフォントから入手できる。
jpgraph_ttf.inc.php
133: // Japanese TrueType font used with FF_MINCHO, FF_PMINCHO, FF_GOTHIC, FF_PGOTHIC
134: // Standard fonts from Infomation-technology Promotion Agency (IPA)
135: // See http://mix-mplus-ipa.sourceforge.jp/
136: define('MINCHO_TTF_FONT','ipam.ttf');
137: define('PMINCHO_TTF_FONT','ipamp.ttf');
138: define('GOTHIC_TTF_FONT','ipag.ttf');
139: define('PGOTHIC_TTF_FONT','ipagp.ttf');
準備:人口データファイル
poppyramid.php
24: // 元となるCSVデータファイル名
25: // 人口・死亡率:2023年 https://www.stat.go.jp/data/nenkan/74nenkan/02.html
26: // 出生率:2022年 https://www.ipss.go.jp/syoushika/tohkei/Popular/Popular2024.asp?chap=4
27: define('FILE_DATA', './population2023.csv');
各列の構造は以下の通り。いずれも2023年(令和5年)時点の値である。
- 年齢
- その年齢における男性の死亡率(千人あたり)
- その年齢における女性の死亡率(千人あたり)
- その年齢における出生率(女性一人あたり)
- その年齢における男性人口(千人)
- その年齢における女性人口(千人)
解説:JpGraph の準備
詳細は、アシアル社のサイトからダウンロードした圧縮ファイルに含まれる日本語ドキュメント(HTML形式)を参照のこと。
解説:データ読み込み
poppyramid.php
79: /**
80: * データファイル(CSV形式)を指定し,人口データを配列に読み込む.
81: * @param string $filename データ・ファイル名
82: * @param array $age 年齢を格納する配列
83: * @param array $male 男性人口を格納する配列
84: * @param array $female 女性人口を格納する配列
85: * @return array 読み込んだデータ/FALSE:データファイルがないなど
86: */
87: function readDate($filename, &$age, &$male, &$female) {
88: $items = array();
89:
90: // 元となるデータファイルを読み込む
91: $infp = fopen(FILE_DATA, 'r');
92: if ($infp == FALSE) return FALSE;
93: fgetcsv($infp, 9999, ',', '"', '\\'); // ラベル行をスキップ
94: $cnt = 0;
95: while (!feof($infp)) {
96: $arr = fgetcsv($infp, 9999, ',', '"', '\\');
97: if (! is_numeric($arr[0])) continue;
98: $age[$cnt] = $arr[0] / 1; // 年齢
99: $male[$cnt] = $arr[4] / 1; // 男性人口(単位:千人)
100: $female[$cnt] = $arr[5] / 1; // 女性人口(単位:千人)
101: $cnt++;
102: if ($cnt > 100) break; // 100歳で打ち切り
103: }
104: fclose($infp);
105:
106: return $items;
107: }
poppyramid.php
124: // 人口ピラミッドは年齢の高い方が上なので配列を逆転させる.
125: $age = array_reverse($age);
126: $male = array_reverse($male);
127: $female = array_reverse($female);
128:
129: // 女性は負数扱い.
130: foreach ($female as $key=>$val) $female[$key] = (0 - $female[$key]);

人口ピラミッドを描くには、水平棒グラフを使う。
グラフの中央をゼロとして、右側が男性人口、左側が女性人口である。男性人口は正数、女性人口は負数として水平グラフを描けば、人口ピラミッドとなるはずである。
そこで、あらかじめ女性人口を負数にしておく。
解説:グラフの作成・描画
poppyramid.php
132: // JpGraphでグラフを生成する
133: $graph = new Graph(WIDTH, HEIGHT, 'auto');
134: $graph->SetScale('textlin');
135:
136: // タイトル、凡例などを設定する.
137: $graph->img->SetImgFormat('png');
138: $graph->img->SetMargin(60, 80, 20, 40);
139: $graph->title->SetFont(FF_PGOTHIC, FS_NORMAL, 16);
140: $graph->title->Set('人口ピラミッド');
141: $graph->legend->SetFont(FF_PGOTHIC);
142: // フッタを設定する.
143: $graph->footer->right->SetFont(FF_PGOTHIC, FS_NORMAL, 10);
144: $graph->footer->right->Set('produced by JpGraph');
145:
146: $graph->xaxis->SetPos('min');
147: $graph->xaxis->title->SetFont(FF_PGOTHIC);
148: $graph->xaxis->title->Set('年齢');
149: $graph->xaxis->SetTextLabelInterval(10); // 10歳おき
150: $graph->xaxis->SetTitleMargin(0);
151:
152: $graph->xaxis->SetPos('min');
153: $graph->yaxis->title->SetFont(FF_PGOTHIC);
154: $graph->yaxis->SetLabelFormatCallback('myNumberFormat');
155:
156: $graph->xaxis->SetFont(FF_PGOTHIC);
157: $graph->xaxis->SetTickLabels($age);
158:
159: // グラフを90度横に倒す.
160: $top = 50;
161: $bottom = 50;
162: $left = 50;
163: $right = 50;
164: $graph->Set90AndMargin($left, $right, $top, $bottom);
165:
166: // 男性の棒グラフを準備する.
167: $PlotMale = new BarPlot($male);
168: $PlotMale->SetWidth(1.0);
169: $PlotMale->SetLegend('男性');
170:
171: // 女性の棒グラフを準備する.
172: $PlotFemale = new BarPlot($female);
173: $PlotFemale->SetWidth(1.0);
174: $PlotFemale->SetLegend('女性');
175:
176: // 2つの棒グラフを結合する.
177: $graph->Add($PlotFemale);
178: $graph->Add($PlotMale);
179:
180: // 最後に色指定を行う.
181: $PlotFemale->SetColor('red');
182: $PlotFemale->SetFillColor('red@0.6');
183: $PlotMale->SetColor('blue');
184: $PlotMale->SetFillColor('blue@0.6');
185:
186: // グラフを画面に表示する.
187: $graph->Stroke();
まず、新しいグラフオブジェクト $graph を生成する。

JpGraph では水平棒グラフは扱えない。そこで、通常の棒グラフを描いたグラフ領域全体をメソッド Set90AndMargin により90度横に倒すことで実現する。
この際、描画領域境界からのマージン($top, $bottom, $left, $right)を設定しておく必要がある。

メソッド SetLegend はグラフの凡例を定義する。
ここでは日本語を使っているが、TrueTypeフォントを使うので UTF-8 でエンコードしてやる必要があるが、本プログラムは内部コードが UTF-8 なので、とくに変換を意識する必要はない。

メソッド SetLabelFormatCallback を使って軸目盛りの書式を指定できる。ここではユーザー関数 myNumberFormat を指定している。この関数は、女性人口が負数となっていることを見せないようにするため、値の絶対値をとり、カンマ区切りを入れた正の整数として表示するものである。

日本語フォントファイルを導入し、FF_PGOTHIC に対して日本語フォントを対応づけていれば、日本語表示が可能であるはずである。ただし、日本語の指定は UTF-8 コードで行うこと。これは、「PHPでTrueTypeフォントを利用する」で述べたのと同じ理由による。

男性と女性は、別々のグラフとして描く。まず男性のグラフである。
BarPlot メソッドで棒グラフ・オブジェクトを生成する。棒グラフの間隔はゼロにする。

メソッド Add を使い、グラフオブジェクト $graph に男性のグラフと女性のグラフを結合する。グラフのタイトルや軸名称も設定する。

グラフの色指定は、メソッド Add のあとに行う。これは JpGraph 4.2 の仕様である。
棒グラフの塗りつぶし色を指定するメソッド SetFillColor では、透明度を指定できる。アットマークの後に透明度を指定する。

最後に、Storoke メソッドを使って画面にグラフを表示する。
参考サイト
- JpGraph公式サイト
- アシアル株式会社
- IPAフォント:文字情報技術促進協議会
- PHPで人口を推計する:ぱふぅ家のホームページ
- 日本統計年鑑:総務省統計局
- 人口統計資料集:国立社会保障・人口問題研究所
ぱふぅ家ホームページでは、JpGraphを使ってアクセス回数の推移などを表示している。
今回は、JpGraph を用い、日本の人口ピラミッドを表示させるプログラムを作ってみることにする。
(2025年1月19日)人口データを2023年版に更新, PHP8.4対応