円グラフを PHP で作るには GD に含まれる imagefilledarc() を使うのが便利です。
この関数は塗りつぶした楕円弧を描くためのものです
<?php //値 $values = array(30, 40, 60, 80, 20); //グラフに使う色 $colorset = array( 'ff3b3b', 'bc3bff', '44aeff', 'aeff3b', 'ffa53b' ); $width = 240; $height = 240; $cx = round( $width / 2 ); $cy = round( $height / 2 ); $image = imagecreatetruecolor($width, $height); //背景 $bg = imagecolorallocate( $image, 255, 255, 255 ); imagefill($image, 0, 0, $bg); list($red, $green, $blue) = parse_color($colorset[0]); rsort($values); $scale = 360 / array_sum($values); $count = count($values); $start = -90; $end = $start; foreach($values as $key => $value){ list($red, $green, $blue) = parse_color( current($colorset) ); $start = $end; $end = ($key === $count - 1) ? 270 : $end = $value * $scale + $start; $color = imagecolorallocate($image, $red, $green, $blue); imagefilledarc($image, $cx, $cy, $width, $height, $start, $end, $color, IMG_ARC_PIE); $res = next($colorset); if($res === false) reset($colorset); } // 画像を出力します header('Content-type: image/png'); imagepng($image); imagedestroy($image); function parse_color($rgb){ $res = str_split($rgb, 2); $red = intval($res[0], 16); $green = intval($res[1], 16); $blue = intval($res[2], 16); return array( $red, $green, $blue ); }
配列の数値を大きいものから順に並び替え、360 度で表せるように倍率を調整しています。
丸め誤差によりぴったりと円が閉じないことがあるので最後の値の時は確実に閉じるように処理を加えてあります。
この関数の 0 度は 3 時方向からスタートするので、12 時方向からスタートさせるために -90 度させています。
グラフに使う色は 16 進数で指定できるようにしました。直接 RGB の数値をそれぞれ入力させてもいいのですが馴染みやすいのでこの表示を使っています。
カラーセットで用意した色数よりも多い値が与えられても、繰り返し使用するので色が不足することはありませんが、数によっては開始の色と最後の値の色が同じになってしまうので、値が奇数個の時と偶数個の時でカラーセットの数を調整する仕組みをつけたほうがいいと思います。
Similar Posts:
- [PHP]レーダーチャート(クモの巣グラフ)をGDで描画する
- [PHP]GDを使った棒グラフの描画
- [PHP]GDで折れ線グラフを描画する(改訂版)
- [PHP]中心から角度を指定して線を引く(座標の回転)
- [PHP]HSV(HSB)色空間を比較して似た色合いの画像を検索する
- [PHP]GDでアンチエイリアスのかかった綺麗な楕円を描く
- [PHP]3次スプライン曲線を使ったスプライン補間
- [PHP]似た色合いの画像をRGB値をもとに探す