2

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

4

2 回答 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 回答