円グラフの生成には多くのコードが使用できます。今日紹介する例は、PHP gd ライブラリに基づいて統計データを生成する円グラフ効果です。必要な学生はそれを参照できます。
コードは次のとおりです | コードをコピーします |
< //+-------------+ //| pie3dfun .PHP//パブリック関数 //+----------------------+ define("ANGLE_STEP", 5); //描画を定義する 楕円弧の角度ステップ functiondraw_getdarkcolor($img,$clr) //$clr に対応する暗い色を見つける { $rgb = imagecolorsforindex($img,$clr); return array( $rgb["red" ]/2,$rgb["green"]/2,$rgb["blue"]/2); } functiondraw_getexy($a, $b, $d) //角度 $d に対応する楕円 点座標 { $d = deg2rad($d); return array(round($a*Cos($d)),round($b*Sin($d)); } functiondraw_arc( $img,$ox,$oy,$a,$b,$sd,$ed,$clr) //楕円弧関数 { $n = ceil(($ed-$sd)/ ANGLE_STEP); $ d = $sd; list($x0,$y0) =draw_getexy($a,$b,$d); for($i<$n; $i++) { $d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP) list($x, $y) =draw_getexy($a, $b, $d); ($img, $ x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr); $y0 = $y; $img, $ox , $oy, $a, $b, $sd, $ed, $clr) // 扇形を描画します { $n = ceil(($ed-$sd)/ANGLE_STEP); d = $sd; list($x0,$y0) =draw_getexy($a, $b, $d); imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $ clr); for( $i{ $d = ($d+ANGLE_STEP)>$ed?$ed:($d+ANGLE_STEP); $x, $y) =draw_getexy($a, $b, $d); imageline($img, $x0+$ox, $y0+$oy, $x+$ox, $y+$oy, $clr); $x0 = $x; $y0 = $y; imageline($img, $x0+$ox, $y0+$oy, $ox, $oy, $clr); =draw_getexy($a/2,$b/2,($d+$sd)/2); imagefill($x+$ox,$y+$oy,$clr); 関数draw_sector3d($) img, $ox, $ oy, $a, $b, $v, $sd, $ed, $clr) //3D セクター { draw_sector($img, $ox, $oy, $a, $b, $sd, $ed, $clr); if($sd{ list($R, $G, $B) =draw_getdarkcolor($img, $clr); $clr=imagecolorallocate($img) , $R, $G , $B); if($ed>180) $ed = 180; list($sx, $sy) =draw_getexy($a,$b,$sd); = $ox; $ sy += $oy; リスト($ex, $ey) = $ex += $ox; imageline($img, $sx, $sy, $sx, $sy+$v, $clr); imageline($img, $ex, $ey, $ex, $ey+$v, $clr); ($img, $ox , $oy+$v, $a, $b, $sd, $ed, $clr); list($sx, $sy) =draw_getexy($a, $b, ($sd+$) ed)/2); $sy += $oy+$v/2; imagefill($img, $sx, $clr); 関数draw_getindexcolor( $img, $clr) //RGB をインデックスカラーにします { $R = ($clr>>16) & 0xff; $G = ($clr>>8)& 0xff; clr) & 0xff; return imagecolorallocate($img, $R, $G, $B); } // main 関数を描画し、画像を出力します // $datLst はデータ配列、$datLst はラベルです配列、$datLst はカラー配列です / / 上記 3 つの配列の次元は等しい必要があります functiondraw_img($datLst,$labLst,$clrLst,$a=250,$b=120,$v=20,$ font=10) { $ox = 5 +$a; $fw = imagefontheight($font); $datLst);//データ項目数 $w = 10+$a*2; $h = 10+$b*2+$v+($fh+2)*$n; $w, $h); //転送RGBはインデックスカラー for($i$clrLst[$i] =draw_getindexcolor($img,$clrLst[$i] ]); $clrbk = imagecolorallocate($img , 0xff, 0xff, 0xff); $clrt = imagecolorallocate($img, 0x00, 0x00); //背景色を塗りつぶします imagefill($img, 0, 0, $clrbk); //合計 $tot = 0; for($i$tot += $datLst[$i]; ; $ed = 0; 333 $ly = 10+$b*2+$v; { $sd = $ed; ed += $datLst[$i]/$ tot*360 //丸いケーキを描く draw_sector3d($img, $b, $v, $sd, $ed, $ clrLst[$i]); //$sd, $ed,$clrLst[$i]); //ラベルを描画 imagefilledrectangle($img, 5, $ly, 5+$fw, $ly+$fh, $ clrLst[$i]); imagerectangle($img , 5, $ly, 5+$fw, $ly+$fh, $clrt); //imagestring($img, $font, 5+2*$fw, $ly, $labLst[$i].": ".$datLst[$i]."(".(round(10000*($datLst[$i]/$tot))/100)."%)" , $clrt); $str = iconv(" GB2312", "UTF-8", $labLst[$i]);ImageTTFText($img, $font, 0, 5+2*$fw, $ly+13, $clrt, "./simsun.ttf", $str.":".$datLst[$i]."(" .(round(10000*($datLst[$i]/$tot))/100)."%)"); $ly += $fh+2; //出力グラフィックス header("Content -type: image/png"); //生成された画像を出力します $imgFileName = "../temp/".time().".png"; imagepng($img,$imgFileName); echo ' '''''''''''''''''''''''''''''''''''''''''''''' '''''''''''' } $datLst = array(30, 10, 20, 20, 10, 20, 10, 20); //data $ labLst = array("理科大学「中国の科学技術」、「安徽科学技術大学」、「清華大学」、「北京大学」、「南京大学」、「上海大学」、「河海大学」、「中山大学」); / / タグ $clrLst = array(0x99ff00, 0xff6666, 0x0099ff, 0xff99ff, 0xffff99, 0x99ffff, 0xff3333, 0x009999); //描画 draw_img($datLst,$labLst,$clrLst); ?> |