1. 導入:なぜPHPでグラフを生成するのか
Webアプリケーションの開発において、統計データや分析結果を可視化する際、JavaScript(Chart.jsなど)で描画するのが一般的です。しかし、PDFレポートの自動生成、メールでのグラフ画像添付、あるいはJavaScriptを無効化しているクライアント環境への対応など、サーバーサイドで画像ファイルを生成する必要があるケースも少なくありません。PHPのGDライブラリを活用することで、動的なレーダーチャートや円グラフをサーバー側で完結して作成することが可能です。
2. 基礎知識:GDライブラリとは
GD(Graphics Draw)は、PHPで画像を動的に作成・操作するための標準的なライブラリです。ビットマップ形式(PNG, JPEG, GIFなど)の画像を生成でき、線の描画、図形の塗りつぶし、テキストの配置、色の指定など、画像編集ソフトに近い機能をコードで制御できます。特に座標計算には三角関数(sin, cos)を多用するため、数学的なアプローチが必要となります。
3. 実装/解決策:座標計算と描画のポイント
グラフ描画で最も重要なのは「度数法(Degrees)をラジアン(Radians)に変換すること」と、「中心座標からのオフセット計算」です。
レーダーチャートのような多角形を描く際は、中心点から特定の角度と距離にある座標を求める関数(point_rotate)を定義し、その結果を配列に格納してimagepolygon関数に渡すのが定石です。
4. サンプルプログラム:円グラフの生成
以下は、値を元に自動で円グラフを生成する実用的なコード例です。
/
function parse_color($rgb) {
$res = str_split($rgb, 2);
return [intval($res[0], 16), intval($res[1], 16), intval($res[2], 16)];
}
// グラフデータ
$values = [30, 40, 60, 80, 20];
$colorset = [‘ff3b3b’, ‘bc3bff’, ’44aeff’, ‘aeff3b’, ‘ffa53b’];
$size = 240;
$image = imagecreatetruecolor($size, $size);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
rsort($values); // グラフ描画のために大きい順にソート
$total = array_sum($values);
$start_angle = -90; // 12時方向から開始
foreach ($values as $key => $value) {
$angle = ($value / $total) 360;
$end_angle = $start_angle + $angle;
// カラーコードをRGBに変換して色を割り当て
list($r, $g, $b) = parse_color($colorset[$key % count($colorset)]);
$color = imagecolorallocate($image, $r, $g, $b);
// 扇形を描画
imagefilledarc($image, $size/2, $size/2, $size, $size, $start_angle, $end_angle, $color, IMG_ARC_PIE);
$start_angle = $end_angle;
}
header(‘Content-Type: image/png’);
imagepng($image);
imagedestroy($image);
?>
5. 応用・注意点:実務でのトラブル回避
・丸め誤差の処理:浮動小数点の計算により、円がわずかに閉じない場合があります。最後の要素を描画する際は、開始角度を確実に270度(360度)で閉じるような条件分岐を入れるのが安全です。
・フォントのパス:サーバー環境(Linux等)では、日本語フォントがインストールされていないことが多いです。プロジェクトディレクトリにttfファイルを同梱し、絶対パスで読み込むようにしてください。
・メモリ制限:高解像度の画像を大量に生成するとメモリを消費します。imagedestroy関数を確実に呼び出し、不要なメモリ解放を徹底してください。
・アンチエイリアス:imageantialias($image, true)を有効にすると、図形の境界線が滑らかになり、クオリティが大幅に向上します。ぜひ組み合わせて活用してください。