我正在使用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 回答