在 Perl 中格式化 GD::Graph x 轴
Formatting GD::Graph x-axis in Perl
我正在生成价格随时间变化的图表。因为我在 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 bug page
中没有关于此问题的错误报告
通过检查 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,
);
根据 documentation:
x_tick_number
If set to 'auto', GD::Graph
will attempt to format the X
axis in a nice way, based on the actual X values. If set to a number,
that's the number of ticks you will get. If set to undef
, GD::Graph
will treat X data as labels. Default: undef
.
我正在生成价格随时间变化的图表。因为我在 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 bug page
中没有关于此问题的错误报告通过检查 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,
);
根据 documentation:
x_tick_number
If set to 'auto',GD::Graph
will attempt to format the X axis in a nice way, based on the actual X values. If set to a number, that's the number of ticks you will get. If set toundef
,GD::Graph
will treat X data as labels. Default:undef
.