無料/デスクトップ壁紙/PSP壁紙/携帯待ち受け/写真素材/PHPスクリプト

Web > PHP > PHPで立体的な円グラフの作成

円グラフの作成

動的に円グラフを作成します。
綺麗とは言えませんが、比較的簡単に作れます。

image.php
<?php

// 画像を作成
$image = imagecreatetruecolor(300, 300);

// 色の割り当て(通常色)
$color[0]		= imagecolorallocate($image, 220, 220, 220);
$color[1]		= imagecolorallocate($image, 230, 230, 250);
$color[2]		= imagecolorallocate($image, 176, 196, 222);
$color[3]		= imagecolorallocate($image, 204, 228, 250);
$color[4]		= imagecolorallocate($image, 199, 249, 199);
$color[5]		= imagecolorallocate($image, 239, 234, 191);
$color[6]		= imagecolorallocate($image, 255, 204, 209);

// 色の割り当て(影用)
$color3D[0]		= imagecolorallocate($image, 190, 190, 190);
$color3D[1]		= imagecolorallocate($image, 200, 200, 220);
$color3D[2]		= imagecolorallocate($image, 146, 166, 192);
$color3D[3]		= imagecolorallocate($image, 174, 198, 220);
$color3D[4]		= imagecolorallocate($image, 169, 219, 169);
$color3D[5]		= imagecolorallocate($image, 209, 204, 161);
$color3D[6]		= imagecolorallocate($image, 225, 174, 179);

// #333333
$color333 = imagecolorallocate($image, 0x33, 0x33, 0x33);

// 背景を塗りつぶし(#EEEEEE)
imagefill($image, 0, 0, imagecolorallocate($image, 0xEE, 0xEE, 0xEE));

// 中心の座標、幅・高さ
$cx = 150;
$cy = 150;
$width = 250;
$height = 125;

// データ
$data = array(1, 3, 6, 3, 3, 3, 4);

// 投票数の合計値
$sum = 0;
$count = count($data);
for ($i = 0; $i < $count; $i++) {
	$sum += $data[$i];
}

// 立体感を出すために一番下に描画
// 半円よりちょっと大きいぐらい
imagefilledarc($image, $cx, $cy + 15, $width, $height, -30, 210, $color333, IMG_ARC_PIE);

// データから描画
$start = 0;
$end = 270;
for ($i = 0; $i < $count; $i++) {
	$start = $end;
	if ($data[$i] == 0) { break; }
	$end += (int)(($data[$i] / $sum) * 360);
	if ($end >= 360) {
		$end -= 360;
	}
	
	// 0から180の間に被ってたときのみ
	// 立体的にするための描画
	if (($start > 0 && $start < 180) || ($end > 0 && $end < 180) || ($start >= 270 && $end >= 180)) {
		for ($j = 0; $j <= 10; $j++) {
			imagearc($image, $cx, $cy + $j, $width, $height, $start, $end, $color3D[$i]);
		}
	}

	// メインのグラフ描画
	imagefilledarc($image, $cx, $cy, $width, $height, $start, $end, $color[$i], IMG_ARC_PIE);
}

// 画像の出力
header("Content-type: image/png");
imagepng($image);

// データは必ず破棄する
imagedestroy($image);

?>

実行例

使い方

<img src="./image.php" />

データを外部から動的にしたい場合以下のようなやり方もあります
※最低限データの個数分、色を用意しておかないとエラーになります。

image.php のデータの部分を以下のように書き換える

$data = array();
$data = $_GET["c"];

GET 方式でデータを渡してやります。
こうすると配列でデータを渡すこと出来ます。

<img src="./image.php?c[]=3&c[]=0&c[]=0&c[]=1&c[]=9" />

問題点

データによっては最後のほうがぴったりにならず空白が出来てしまいます。
単純な解決方法としては一番最初の色で一度円を描画しておくと埋まることは埋まります。

参考

円グラフの生成 - PHP/データベース
PHP: GD - Manual

最終更新日 2010/06/03