まいける's Tech Blog

LAMP関係のメモなどを不定期に掲載します

PEAR Image_Graph 覚え書き(2)

 前回のエントリーに引き続き、PEAR Image_Graph に関する覚え書き。アクセス解析を見ていると、Image_Graph で困っている人が多いみたいなので。

 日別の推移グラフのように、X軸に数値以外のデータを置くことって、少なくないと思うのですが、項目が増えてくると字が重なってしまうのです。X軸もY軸もデフォルトでは、項目の間隔を自動的に設定してくれるはずなのに…と、不思議に思っていたのですが、ソースを見て、謎が解けました。

 自動的に設定してくれるのは、軸のデータが数値のときだけなのです

 というわけで、軸のデータが数値でないときに、項目の間隔を適当に設定するためのコードを書いてみました。といっても、Image_Graph の中の Axis.php の _calcLabelInterval 関数を少しいじっただけなんですけど。

<?php

// 前略

// 配列 $AxisXLabel に X軸のデータが入っているとして	

$AxisXLabelspan = count( $AxisXLabel ) - 1;
$AxisXLabelinterval = pow(10, floor(log10($AxisXLabelspan)));

if ($AxisXLabelinterval == 0) {
	$AxisXLabelinterval = 1;
}

if ((($AxisXLabelspan) / $AxisXLabelinterval) < 3) {
	$AxisXLabelinterval = $AxisXLabelinterval / 4;
} elseif ((($AxisXLabelspan) / $AxisXLabelinterval) < 5) {
	$AxisXLabelinterval = $AxisXLabelinterval / 2;
} elseif ((($AxisXLabelspan) / $AxisXLabelinterval) > 10) {
	$AxisXLabelinterval = $AxisXLabelinterval * 2;
}

if (($AxisXLabelinterval -floor($AxisXLabelinterval) == 0.5) && ($AxisXLabelinterval != 0.5)) {
	$AxisXLabelinterval = floor($AxisXLabelinterval);
}

if ($AxisXLabelinterval == 0) {
	$AxisXLabelinterval = ($AxisXLabelspan) / 5;
}

if ($AxisXLabelinterval == 0) {
	$AxisXLabelinterval = 1;
}

$AxisX =& $Plotarea->getAxis('x');
$AxisX->setLabelInterval($AxisXLabelinterval);

// 後略

?>

こんな感じで書けば、いちおう項目の数に応じて間隔が適当に空くようになります。

 データが数値のときと、文字列のときで、自動的にどちらの処理をするか判別できるようにすれば、よりよいのでしょうが、そこはもっと偉い人にお願いすることにしたいと思います。