色々な言語でグラフを作っていますが、一番どこにでも入っている最低限の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に埋め込む場合:
HTML・CSS・JavaScriptは一切不要です。