Чтобы уточнить: вы объявляете высоту 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
}
Надеюсь, это полезно для вас.