PHPだけでPNGグラフを生成する最小サンプル:GD拡張

色々な言語でグラフを作っていますが、一番どこにでも入っている最低限のPHPで書く方法を説明します。
「JavaScriptを使わず、サーバ側だけでグラフ画像を生成したい」
という場面が意外と多くあります。

例えば、
管理画面の タグで使いたい
PDFにそのまま埋め込みたい
バッチ処理で画像を生成して保存したい
外部サービスに依存したくない
こうした用途では、PHPのGD拡張を使ったPNG生成がシンプルで堅牢です。

本記事では、
・外部ライブラリ不要
・1ファイルで動作
・棒グラフの最小構成
という条件で、実用に耐えるサンプルを紹介します。

事前条件
PHP 8.x 以上
gd 拡張が有効

確認方法:

php -m | grep gd

表示されれば準備OKです。
仕組みの概要

流れ

今回のグラフ生成は、以下の流れで行います。

PHPでキャンバス(画像)を作成

背景・枠線・色を定義
データ配列をスケール変換
棒(バー)を描画
HTTPレスポンスとしてPNGを返す
ポイントは、
「HTMLではなく画像を返すPHP」
という点です。

最小構成のサンプルコード
以下のファイルを graph.php として保存してください。

<?php
declare(strict_types=1);

/*
 * ==============================
 * Simple PNG Bar Chart with GD
 * ==============================
 */

// ====== サンプルデータ ここをDBを繋げたり、CSVを読み込んだりしてください。======
$labels = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];
$values = [12, 18, 9, 24, 20, 14, 28];

// ====== 画像サイズと余白 ======
$width  = 800;
$height = 420;

$padL = 60;   // 左余白(Y軸ラベル用)
$padR = 20;
$padT = 30;
$padB = 60;   // 下余白(X軸ラベル用)

// ====== 画像生成 ======
$image = imagecreatetruecolor($width, $height);
imageantialias($image, true);

// ====== 色定義 ======
$bgColor   = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 30, 30, 30);
$gridColor = imagecolorallocate($image, 230, 230, 230);
$barColor  = imagecolorallocate($image, 70, 120, 220);

// 背景塗りつぶし
imagefilledrectangle($image, 0, 0, $width, $height, $bgColor);

// ====== プロット領域 ======
$plotW = $width  - $padL - $padR;
$plotH = $height - $padT - $padB;

$x0 = $padL;
$y0 = $padT;
$x1 = $padL + $plotW;
$y1 = $padT + $plotH;

// 枠線
imagerectangle($image, $x0, $y0, $x1, $y1, $gridColor);

// ====== スケール計算 ======
$maxValue = max($values);
$maxValue = ($maxValue <= 0) ? 1 : $maxValue;

// ====== バー描画 ======
$count = count($values);
$gap   = 10;
$barW  = (int) floor(($plotW - ($gap * ($count + 1))) / $count);
$barW  = max(8, $barW);

for ($i = 0; $i < $count; $i++) {
    $value = $values[$i];

    // X座標
    $x = $x0 + $gap + $i * ($barW + $gap);

    // 高さ(最大値基準で正規化)
    $barH = (int) round(($value / $maxValue) * ($plotH - 10));
    $y    = $y1 - $barH;

    // 棒
    imagefilledrectangle(
        $image,
        $x,
        $y,
        $x + $barW,
        $y1,
        $barColor
    );

    // 数値表示(上)
    imagestring($image, 3, $x + 2, $y - 16, (string)$value, $textColor);

    // X軸ラベル(下)
    imagestring(
        $image,
        3,
        $x + 2,
        $y1 + 8,
        $labels[$i] ?? (string)$i,
        $textColor
    );
}

// タイトル
imagestring($image, 5, $padL, 8, 'Weekly Orders (sample)', $textColor);

// ====== 出力 ======
header('Content-Type: image/png');
header('Cache-Control: no-store');

imagepng($image);
imagedestroy($image);

表示方法
ブラウザで直接アクセス:
https://example.com/graph.php
HTMLに埋め込む場合:
weekly graph
HTML・CSS・JavaScriptは一切不要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA