如何让GD :: Graph不显示图形区域之外的点?

时间:2008-11-15 23:13:37

标签: perl gd-graph

我正在使用GD::Graph在Perl中绘制一些图,并且一些数据在我想要显示的区域之外,但是它不是被截断在图形区域外的图表上,而是被绘制在标题,图例和轴标签。有谁知道如何阻止这种情况发生?

2 个答案:

答案 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
}

希望这对你有用。