Как сохранить GD :: Graph от показа точек за пределами области построения графика? - PullRequest
2 голосов
/ 16 ноября 2008

Я делаю некоторые графики в Perl, используя GD :: Graph , и некоторые данные находятся за пределами области, которую я хотел бы отобразить, но вместо того, чтобы обрезаться вне графика вне области построения графика, рисуется над заголовком, надписью и надписью оси. Кто-нибудь знает, как это предотвратить?

Ответы [ 2 ]

1 голос
/ 16 ноября 2008

Если вы знаете свои границы, отфильтруйте данные и не включайте эти точки в данные, которые вы отправляете в GD :: Graph.

0 голосов
/ 17 ноября 2008

Чтобы уточнить: вы объявляете высоту 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
}

Надеюсь, это полезно для вас.

...