2013年1月11日金曜日

[JpGraph]2 つの Y 軸で棒グラフを表示

左右の Y 軸で別々の尺度を持たせる場合には Graph::SetY2Scale を使用する。折れ線グラフの場合はそのままでもグラフを見ることができるのだが、棒グラフの場合は同じ場所に棒グラフが表示されてしまうためにグラフが重なり見えなくなってしまう。
/* グラフ作成 */
$graph = new Graph(350, 250, "auto");
$graph->SetScale("textlin", 0, 100);
$graph->SetY2Scale("lin", 0, 300);

/* X軸項目追加 */
$graph->xaxis->SetTickLabels($a);

/* plot作成 */
$bplot1 = new BarPlot($y1data);
$bplot1->value->Show();
$bplot1->value->SetFormat('%d');

$bplot2 = new BarPlot($y2data);
$bplot2->value->Show();
$bplot2->value->SetFormat('%d');

/* グラフ上に描画 */
$graph->Add($bplot1);
$graph->AddY2($bplot2);

/* グラフ表示 */
$graph->Stroke();














そこで 2 つのグラフを値 0 の dummy グラフとグループ化しておき、その GroupBarPlot を表示することで 2 つの棒グラフが並んで表示されるようにすることができる。
/* グラフ作成 */
$graph = new Graph(350, 250, "auto");
$graph->SetScale("textlin", 0, 100);
$graph->SetY2Scale("lin", 0, 300);
/* 右側の Y 軸で値が全部表示できないのでグラフを表示する場所の
 * margin を指定する
 */
$graph->img->SetMargin(50, 70, 30, 40);

/* X軸項目追加 */
$graph->xaxis->SetTickLabels($a);

/* plot作成 */
$bplot1 = new BarPlot($y1data);
$bplot1->value->Show();
$bplot1->value->SetFormat('%d');

$bplot2 = new BarPlot($y2data);
$bplot2->value->Show();
$bplot2->value->SetFormat('%d');

/* 単純に bplot1, bplot2 を表示するとグラフが重なってしまうので
 * $zerodata のダミーを間に挟んでグループ化して
 * bplot1, bplot2 が並んでいるように表示する
 */
$bplotzero = new BarPlot($zerodata);
$bgplot1 = new GroupBarPlot(array($bplot1, $bplotzero));
$bgplot2 = new GroupBarPlot(array($bplotzero, $bplot2));

/* グラフ上に描画 */
$graph->Add($bgplot1);
$graph->AddY2($bgplot2);

/* グラフ表示 */
$graph->Stroke();

0 件のコメント:

コメントを投稿