4

我正在制作价格随时间变化的图表。因为我在 x 轴上有日期,所以我将它们转换为自纪元以来的天数。自纪元以来的天数不是一个非常明确的值,无法在图表上显示,因此我想使用 x_number_format 选项将它们转换回人类可读的日期。

但是......它似乎没有在图形被渲染时被调用。

我创建了以下测试代码来演示该问题。

use strict;
use GD::Graph::points;

# Generate some random data!
my @x_data;
my @y_data;
for (1...20) {
    push @x_data, $_;
    push @y_data, rand(20) + 10;
}

# This is never called - possible bug!
sub x_format {
    print "X Formatter!\n";
    return " - $_[0] - ";
}

# This gets called for every Y-axis point
sub y_format {
    print "Y Formatter!\n";
    return " - $_[0] - ";
}

my $graph=GD::Graph::points->new(1000,450);
$graph->set(
    y_label             => 'Random numbers',
    y_number_format     => \&y_format,
    x_number_format     => \&x_format,
    x_label             => 'Sequential meaningless numbers',
    x_labels_vertical   => 1,
    x_plot_values       => 1,
);
my @data=(
    [ @x_data ],
    [ @y_data ],
);

open PNG, ">temp.png";
binmode PNG;
print PNG $graph->plot(\@data)->png;
close PNG;

system("temp.png");

此测试代码按预期生成图表并打印Y Formatter!6 次。y 轴上的每个点一个。但是,它不打印X Formatter!也不格式化 x 轴。

我尝试过更直接地格式化 x 轴值

x_number_format     => sub { " - $_[0] - " },

这也不会格式化 x 轴。

我是在做一些非常愚蠢的事情还是这是 GD:Graph 中的错误?GD::Graph 错误页面中没有针对此问题的错误报告

4

1 回答 1

3

通过检查source,我可以看到您需要设置 为要调用x_tick_number的回调的定义值。x_number_format

所以你可以尝试这样的事情:

$graph->set(
    y_label             => 'Random numbers',
    y_number_format     => \&y_format,
    x_number_format     => \&x_format,
    x_tick_number       => 6,
    x_label             => 'Sequential meaningless numbers',
    x_labels_vertical   => 1,
    x_plot_values       => 1,
);

根据文档

x_tick_number
如果设置为“自动”,GD::Graph将尝试根据实际 X 值以一种很好的方式格式化 X 轴。如果设置为一个数字,那就是您将获得的刻度数。如果设置为undefGD::Graph 会将 X 数据视为标签。默认值:undef.

于 2020-05-01T17:58:04.083 回答