GD::Graphを使用して Perl でいくつかのプロットを作成していますが、一部のデータは表示したい領域の外にありますが、グラフ領域の外でチャートから切り捨てられるのではなく、タイトル、凡例、および軸ラベル。これが起こらないようにする方法を知っている人はいますか?
Dan Littlejohn
質問する
717 次
2 に答える
1
境界がわかっている場合は、データをフィルタリングし、GD::Graph に送信するデータにそれらのポイントを含めないでください。
于 2008-11-16T04:01:24.280 に答える
0
明確にするために:y_max_value
高さを宣言していて、データがその境界を超えていますか?それとも、GD::Graph は正しい上限を誤って計算していますか?
値を設定している場合は、値をその上限に固定する必要があります。GD::Graph は、あなたが指示したことを実行しているだけです。(これは多かれ少なかれブライアンが言ったことです)。
OTOH、私は、GD::Graph が常に累積 (積み上げ) グラフにうまく対応できるとは限らずy_max_value
、そのような状況では を過大評価する傾向があることを発見しました。また、目盛り値に浮動小数点数を使用して、Y 軸に見栄えのしない値を生成することもあります。これはあなたが本当に解決しようとしていることですか?
これら両方の問題を抱えていたので、Tie::RangeHash を使用して、常に 5 つの整数ティック ポイントを生成する「きちんとした」インクリメントを作成する解決策を見つけました。
use Tie::RangeHash ;
my $y_ranges = new Tie::RangeHash Type => Tie::RangeHash::TYPE_NUMBER;
$y_ranges->add(' -500, -101', '-25');
$y_ranges->add(' -100, -26', '-10');
$y_ranges->add(' -25, -1', '-5');
$y_ranges->add(' 0, 25', '5');
$y_ranges->add(' 26, 100', '10');
$y_ranges->add(' 101, 500', '25');
$y_ranges->add(' 501, 1000', '100');
$y_ranges->add(' 1001, 5000', '250');
$y_ranges->add(' 5001, 10000','1000');
$y_ranges->add('10001, 50000','2500');
$y_ranges->add('50001,' ,'5000');
sub set_y_axis {
# This routine over-rides the y_max_value calculation in GD::Graph, which produces double the
# required limit, and therefore a lot of white-space...
return 1 unless @_ ; #no point going any further if no arguments were provided, however result has to be
#non-zero to avoid /0 errors in GD::Graph
my @a = map { $_ || 0 } @_ ; #array may have undefs in it. Set null to zero for calc of max
my ($y_max) = sort { $b <=> $a } @a ; # Get largest total for y-axis
my $y_range = $y_ranges->fetch($y_max);
my $y_axis = ($y_max%$y_range==0) ? $y_max+$y_range : ($y_max - ($y_max%$y_range) + $y_range);
sprintf("%d", $y_axis);
}
sub my_graph {
my @ymax;
# generate data... foreach loop etc
push(@ymax, $this_y_value); # append y-value or cumulative y-value as appropriate
# etc.
my $graph = GD::Graph::lines->new(750, 280);
$graph->set(
y_max_value => set_y_axis(@ymax),
x_labels_vertical => 1,
transparent => 1,
# etc
);
# etc
}
それがあなたに役立つことを願っています。
于 2008-11-17T00:04:08.830 に答える