PHPで動的にグラフを描画する
さすがに、gdで絵を描くのはきつかろうということで、探したところpChartにたどり着いた。
本家
http://pchart.sourceforge.net/index.php
ドキュメントの日本語訳
http://www.t-net.ne.jp/~cyfis/p_chart/index.html
M+とIPAの合成フォント
http://mix-mplus-ipa.sourceforge.jp/
<?php include("./pChart.1.27d/pChart/pData.class"); include("./pChart.1.27d/pChart/pChart.class"); $font_dir_path = "./pChart.1.27d/Fonts"; // フォント置く場所をうまく指定しないといけない $font_name = "Migu-1M-regular.ttf"; // データ用意 $dataSet = new pData(); $dataSet->AddPoint(array( 554999, 371095, 376568,1311948,1105588,1993960,1596025), "range1"); $dataSet->AddPoint(array( 746428, 504383, 485484,1933207,1665986,3834749,2484725), "range2"); $dataSet->AddPoint(array( 787426, 534065, 516801,1886867,1611798,3336195,2377285), "range3"); $dataSet->AddPoint(array( 708489, 465814, 490057,1693179,1476011,2791729,2015274), "range4"); $dataSet->AddPoint(array( 181797, 125417, 135876, 297883, 290416, 653277, 412149), "range5"); $dataSet->AddPoint(array('茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '東京都', '神奈川県'), "Serie0"); $dataSet->AddAllSeries(); $dataSet->RemoveSerie("Serie0"); $dataSet->SetAbsciseLabelSerie("Serie0"); $dataSet->SetSerieName( "0-19", "range1"); $dataSet->SetSerieName("20-39", "range2"); $dataSet->SetSerieName("40-59", "range3"); $dataSet->SetSerieName("60-79", "range4"); $dataSet->SetSerieName( "80-", "range5"); $dataSet->SetYAxisName("人"); $dataSet->SetXAxisName("都道府県"); // Y軸の上辺値を得る $maxScale = getMaxScale($dataSet->GetData()); // グラフ生成 $chart = new pChart(600, 350); // 背景色塗りつぶし $chart->drawGraphAreaGradient(230, 255, 255, 2, TARGET_BACKGROUND); $chart->setFontProperties("$font_dir_path/$font_name", 8); $chart->setGraphArea(100, 50, 490, 290); // グラフ領域のサイズ設定 $chart->drawGraphArea(255, 255, 230, false); // グラフ領域の背景色設定 $chart->setFixedScale(0, $maxScale, 5); // 縦は5分割固定 $chart->drawScale($dataSet->GetData(), $dataSet->GetDataDescription(), SCALE_ADDALL, 0, 0, 0, true, 0, 2, true); //$chart->drawGrid(2, false); // 縦罫線いらないから横罫線を手で引く { $y = 290 - 50; $y2 = $y / 5; foreach (range(1, 4) as $time) { $y3 = 50 + $y2 * $time; $chart->drawDottedLine(100, $y3, 490, $y3, 2, 220, 220, 220, 255); } } // 積み上げ棒グラフ $chart->drawStackedBarGraph($dataSet->GetData(), $dataSet->GetDataDescription(), 50); // 第3引数は透過度 // タイトルを描画する $title = "都道府県別人口"; $chart->setFontProperties("$font_dir_path/$font_name", 10); $chart->drawTitle(50, 30, $title, 0, 0, 0, 550); // グラフの判例を描画する $chart->setFontProperties("$font_dir_path/$font_name", 8); $chart->drawLegend(510, 20, $dataSet->GetDataDescription(), 240, 240, 240); $chart->addBorder(1); $chart->Stroke(); function getMaxColumnValue($data) { $tmp = array(); foreach (range(0, count($data)-1) as $i) { $tmp[$i] = 0; } foreach ($data as $index => $value) { foreach (range(1, 5) as $i) { $tmp[$index] += $value['range'.$i]; } } return max($tmp); } function getMaxScale($data) { $maxValue = getMaxColumnValue($data); $base = getBaseNum($maxValue); $mod = $maxValue % $base; $diff = $base - $mod; $result = $maxValue + $diff; return $result; } function getBaseNum($num) { $len = strlen($num); $base = pow(10, $len - 2); // 数値が100万前後じゃないとダメだろこれ return $base; }
いつもの悪い癖で、後半きつくなってきた。Googleのやつみたいに、GUIでちょちょいと編集できるサービスがあればなー。
キャメルとパスカルが混ざってるのって、わざとやってるのかな。
そういえばずっとパスカルって呼んでたけど、最近はアッパーキャメルの方がメジャーなのかしら。
しかも、ここまで書いておいて、pChart2.xの方がよかったりして?
少なくとも全部キャメルになってるみたいな。ドキュメントのjsがおかしいっぽいところあるけど。
カラーピッカー
http://www.colorpicker.com/
政府統計の総合窓口
http://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do
たぶん22年分のデータだったと思う。
Google Chart Tools / Image Charts (aka Chart API)
http://code.google.com/intl/ja/apis/chart/