2

GD::Graphを使用して Perl でいくつかのプロットを作成していますが、一部のデータは表示したい領域の外にありますが、グラフ領域の外でチャートから切り捨てられるのではなく、タイトル、凡例、および軸ラベル。これが起こらないようにする方法を知っている人はいますか?

4

2 に答える 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 に答える