[PHP]円グラフを表示する(GD)

piegraph

円グラフを PHP で作るには GD に含まれる imagefilledarc() を使うのが便利です。
この関数は塗りつぶした楕円弧を描くためのものです

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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 の数値をそれぞれ入力させてもいいのですが馴染みやすいのでこの表示を使っています。
カラーセットで用意した色数よりも多い値が与えられても、繰り返し使用するので色が不足することはありませんが、数によっては開始の色と最後の値の色が同じになってしまうので、値が奇数個の時と偶数個の時でカラーセットの数を調整する仕組みをつけたほうがいいと思います。