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/