我正在使用GD::Graph在Perl中绘制一些图,并且一些数据在我想要显示的区域之外,但是它不是被截断在图形区域外的图表上,而是被绘制在标题,图例和轴标签。有谁知道如何阻止这种情况发生?
答案 0 :(得分:1)
如果您知道自己的界限,请过滤数据,不要在发送到GD :: Graph的数据中包含这些点。
答案 1 :(得分:0)
澄清一下:您是否声明y_max_value
高度并且您的数据溢出了那个边界?或者GD :: Graph错误计算了正确的上限?
如果您要设置该值,则需要将值修复为该上限。 GD :: Graph只是在做你要告诉它的事情。 (这或多或少是Brian所说的)。
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
}
希望这对你有用。