在Perl中格式化GD::图形x轴

在Perl中格式化GD::图形x轴,perl,graph,gd-graph,Perl,Graph,Gd Graph,我正在绘制一张价格随时间变化的图表。因为我在x轴上有日期,所以我将它们转换为自纪元以来的天。从纪元开始的天数不是一个很清晰的值,所以我想使用x_number_格式选项将其转换回人类可读的日期 但是…在渲染图形时,它似乎没有被调用 我创建了以下测试代码来演示这个问题 use strict; use GD::Graph::points; # Generate some random data! my @x_data; my @y_data; for (1...20) { push @x_d

我正在绘制一张价格随时间变化的图表。因为我在x轴上有日期,所以我将它们转换为自纪元以来的天。从纪元开始的天数不是一个很清晰的值,所以我想使用x_number_格式选项将其转换回人类可读的日期

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

我创建了以下测试代码来演示这个问题

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格式化程序6次。y轴上的每个点一个。但是,它不会打印
X格式化程序并且不格式化x轴

我已尝试使用更直接的格式设置x轴值

x_number_format     => sub { " - $_[0] - " },
这也不会格式化x轴

我是在做一些非常愚蠢的事情,还是这是GD:Graph中的一个bug? 在中没有关于此问题的错误报告通过检查,我可以看出您需要设置
x_勾选编号
到要调用的
x_编号格式
回调的定义值

因此,您可以尝试以下方法:

$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\u勾号
如果设置为“自动”,
GD::Graph
将尝试格式化X 根据实际的X值,以一种很好的方式创建轴。如果设置为数字, 这就是你将得到的滴答声的数量。如果设置为
unde
GD::Graph
将X数据视为标签。默认值:
undef


非常感谢你。我确实试过寻找来源,但找不到确切的位置。似乎,正如我所怀疑的,我遗漏了一些非常明显的东西。